首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift软件包管理器:如何将本地共享库作为依赖项添加到多个可执行文件?

Swift软件包管理器:如何将本地共享库作为依赖项添加到多个可执行文件?
EN

Stack Overflow用户
提问于 2020-12-17 11:23:20
回答 2查看 1.6K关注 0票数 0

我有一个简单的gRPC应用程序,一个客户端和一个服务器。两者都依赖于生成的快速grpc绑定。为了简单起见,当我将共享文件复制一次到客户端文件夹,第二次复制到服务器文件夹时,会快速构建并运行这两种文件。出于明显的原因,我希望将共享文件分为共享库、服务器库和客户端库,目的是只将共享和客户端特定的库导入客户端。

从名为DmxLib的共享库开始,我无法理解Package.swift文件。从本质上讲,这些文档说,创建一个lib,并将其作为依赖项添加到这里。当我这样做的时候,Swift构建失败了,说导入的文件不存在。当我将DmXLib文件夹中的本地文件添加到产品依赖项时,它会告诉我找不到该文件。

编辑器是VSCode,平台是Ubuntu20.04和SWIFT5.3,没有XCode。

我如何准确地声明一个共享的本地库,该库可以导入,并在客户机和服务器中实际使用?

我的源树看起来是这样的

还有我的Package.swift文件

代码语言:javascript
复制
        // 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"),
                ]),
            ] 
        )
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-18 13:41:03

这样就行了。您不需要将“依赖项”添加到所有源都在本地计算机上的目标中。

代码语言:javascript
复制
// 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目录,其中有三个文件夹,分别名为DmxLibDmxClientDmxServer

注意:我实际上已经将swift-tools-version更新为5.3,因为我从https://github.com/Samasaur1/Solver/blob/main/Package.swift复制和修改了它,但我认为它应该与swift-tools-version为5.2的

票数 1
EN

Stack Overflow用户

发布于 2022-05-13 07:08:51

对于本地,我们的Xcode UI/UX很差。

(在我的示例中,我有一个SPM、"LocalSPMLib“和一个消费应用程序"LocalSPMConsumerApp")

你可以这样做:

  1. 像往常一样添加SPM,通过SPM菜单添加,或者拖到项目中。

它会增加项目,但不会奏效.应该出现在二进制文件下,但不显示;(

  1. 重新添加为二进制自由(可怕的.但有效.)

现在您可以调用:

代码语言:javascript
复制
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)

    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65339778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档