我有一个简单的gRPC应用程序,一个客户端和一个服务器。两者都依赖于生成的快速grpc绑定。为了简单起见,当我将共享文件复制一次到客户端文件夹,第二次复制到服务器文件夹时,会快速构建并运行这两种文件。出于明显的原因,我希望将共享文件分为共享库、服务器库和客户端库,目的是只将共享和客户端特定的库导入客户端。
从名为DmxLib的共享库开始,我无法理解Package.swift文件。从本质上讲,这些文档说,创建一个lib,并将其作为依赖项添加到这里。当我这样做的时候,Swift构建失败了,说导入的文件不存在。当我将DmXLib文件夹中的本地文件添加到产品依赖项时,它会告诉我找不到该文件。
编辑器是VSCode,平台是Ubuntu20.04和SWIFT5.3,没有XCode。
我如何准确地声明一个共享的本地库,该库可以导入,并在客户机和服务器中实际使用?
我的源树看起来是这样的

还有我的Package.swift文件
// swift-tools-version:5.2
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "dmx-db",
products: [
.executable(name: "DmxServer", targets: ["DmxServer"]),
.executable(name: "DmxClient", targets: ["DmxClient"]),
// This lib will be imported into both, client and server.
.library(name: "DmxLib", targets: ["DmxLib"]),
],
dependencies: [
.package(url: "https://github.com/grpc/grpc-swift.git", from: "1.0.0-alpha.21"),
.package(url: "https://github.com/codewinsdotcom/PostgresClientKit", from: "1.0.0"),
.package(url: "https://github.com/swift-server/swift-service-lifecycle.git", from: "1.0.0-alpha.5"),
// Why do I have to declare local files as dependencies???
.package(path: "../Sources/DmxLib/datasource.grpc.swift")
],
//
targets: [
.target(name: "DmxLib", dependencies: [
"datasource.grpc.swift"
] ),
.target(name: "DmxServer", dependencies: [
"DmxLib",
.product(name: "GRPC", package: "grpc-swift"),
.product(name: "PostgresClientKit", package: "PostgresClientKit"),
.product(name: "Lifecycle", package: "swift-service-lifecycle"),
]),
.target(name: "DmxClient", dependencies: [
"DmxLib",
.product(name: "GRPC", package: "grpc-swift"),
]),
]
)发布于 2020-12-18 13:41:03
这样就行了。您不需要将“依赖项”添加到所有源都在本地计算机上的目标中。
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "dmx-db",
products: [
.executable(name: "DmxServer", targets: ["DmxServer"]),
.executable(name: "DmxClient", targets: ["DmxClient"]),
// This lib will be imported into both, client and server.
.library(name: "DmxLib", targets: ["DmxLib"]),
],
dependencies: [
.package(url: "https://github.com/grpc/grpc-swift.git", from: "1.0.0-alpha.21"),
.package(url: "https://github.com/codewinsdotcom/PostgresClientKit", from: "1.0.0"),
.package(url: "https://github.com/swift-server/swift-service-lifecycle.git", from: "1.0.0-alpha.5"),
],
targets: [
.target(name: "DmxServer", dependencies: [
"DmxLib",
.product(name: "GRPC", package: "grpc-swift"),
.product(name: "PostgresClientKit", package: "PostgresClientKit"),
.product(name: "Lifecycle", package: "swift-service-lifecycle"),
]),
.target(name: "DmxClient", dependencies: [
"DmxLib",
.product(name: "GRPC", package: "grpc-swift"),
]),
.target(name: "DmxLib", dependencies: []),
]
)这确实要求您在包的根目录中有一个Sources目录,其中有三个文件夹,分别名为DmxLib、DmxClient和DmxServer。
注意:我实际上已经将swift-tools-version更新为5.3,因为我从https://github.com/Samasaur1/Solver/blob/main/Package.swift复制和修改了它,但我认为它应该与swift-tools-version为5.2的
发布于 2022-05-13 07:08:51
对于本地,我们的Xcode UI/UX很差。
(在我的示例中,我有一个SPM、"LocalSPMLib“和一个消费应用程序"LocalSPMConsumerApp")
你可以这样做:
它会增加项目,但不会奏效.应该出现在二进制文件下,但不显示;(

现在您可以调用:
import XCTest
import LocalSPMLib
@testable import LocalSPMConsumerApp
class LocalSPMConsumerAppTests: XCTestCase {
override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
func testExample() throws {
XCTAssertEqual(LocalSPMLib().version, 1)
}
}https://stackoverflow.com/questions/65339778
复制相似问题