【问题标题】:Swift Package - Distribute standalone executable with bundleSwift Package - 使用 bundle 分发独立的可执行文件
【发布时间】:2020-11-26 09:09:47
【问题描述】:

我正在编写一个作为独立 Swift 包的 Swift 脚本。这个脚本的一部分需要生成一些文件,我有模板。

现在,这些模板不可编译(它们是 HTML 文件);所以为了将它们包含在包中,我将它们包含为.copy("Templates")

在调试我的脚本时,我可以正常访问模板,但当我尝试归档产品时,可执行文件无法再访问它们

这是我的 Package.swift:

let package = Package(
    name: "flucs",
    products: [
        .executable(name: "Flucs",
                    targets: ["flucs"])
    ],
    dependencies: [
        .package(url: "https://github.com/MrSkwiggs/Netswift", .exact(.init(0, 3, 1))),
    ],
    targets: [
        .target(
            name: "flucs",
            dependencies: ["Netswift"],
            path: "Sources",
            resources: [
                .copy("Templates")
            ]),
        
        .testTarget(
            name: "flucsTests",
            dependencies: ["flucs"]),
    ]
)

我的文件夹结构:

如何分发我的脚本以使其也包含其资源?

【问题讨论】:

    标签: swift bundle software-distribution swift-package-manager


    【解决方案1】:

    SPM 将您的资源编译到单独的包中,但命令行工具只是一个没有包的可执行文件,并且您添加到可执行文件中的任何资源都会被 Xcode(构建阶段 > 复制包资源)简单地忽略以进行发布(存档)构建。

    如果您查看Bundle.module 内部,您会发现:

    ...
    // For command-line tools.
    Bundle.main.bundleURL,
    ...
    

    Bundle.main.bundleURL 是包含您的命令行可执行文件的目录的有效文件 url,以便它在可执行文件旁边查找您的包。它适用于 Debug,因为 XCode 只是在可执行文件附近编译资源包。

    使用已编译的.bundle 文件获取 Release 可执行文件的最简单方法是从命令行构建您的包:

    swift build --configuration release
    

    然后你可以在.build/release文件夹中找到它们。

    【讨论】:

    • 但是,如果我想分发我的脚本,这是否意味着我总是必须与捆绑包一起分发?这不是很方便:/
    • @Skwiggs 使用 Swift Package 的一种可能解决方案是将模板作为字符串移动到代码中,然后将它们编译为二进制文件。但是你总是可以摆脱 Swift Package 并制作支持捆绑包而不是命令行(纯二进制)的应用程序(.app)。
    • 是的,现在我将原始模板文本作为变量包含在我的代码中......不是超级方便,但比编写实际应用程序更容易
    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 2012-08-22
    • 2021-10-04
    • 2011-06-21
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多