【问题标题】:Package.swift together with Xcode 11 Project, how to use Carthage and SPM alongside?Package.swift 与 Xcode 11 项目一起使用,如何同时使用 Carthage 和 SPM?
【发布时间】:2020-02-18 14:16:19
【问题描述】:

我感觉夹在 Carthage 世界和 Swift Package Manager (SPM) 世界之间,就像被困在了炼狱中。

我正在开发a Swift library/SDK,到目前为止,我一直在使用 Carthage 进行依赖。但是由于 SPM 最终可以与 iOS 一起使用,我觉得对于想要使用这个库的人来说,能够通过 SPM 包含它会很棒。

但是,我碰壁了。我的依赖项之一,即 BitcoinKit 与 Carthage 一起使用,但 SPM 支持已损坏。

为了分发我的库,我需要有一个 Package.swift 文件和一些其他标准(自述文件、Sources 中的源文件和Tests 中的测试)。我还需要在上述Package.swift 文件中声明我的依赖项,以便 SPM recursivley 可以解决所有依赖项(当人们通过 SPM 安装我的库时)。这就是我卡住的地方...

由于我仍在使用 Carthage,我需要一个 Xcode 项目文件来设置这个 Carthage 依赖项。但现在我的源文件无法导入 SPM 依赖项。他们没有被发现。似乎我必须使用 Xcode 和Add Package Dependency feature (Apple doc here) 包含 SPM 包依赖项。这不是我想要的,我希望我的Package.swift 文件声明我的库使用的相同版本的 SPM 包。说清楚,这个问题的出现是因为我需要一个 Xcode 项目,由于 Carthage。

所以我想也许我可以用 Carthage 构建 BitcoinKit(就像我现在正在做的那样),并将构建的二进制文件 (.Carthage/Build/iOS/BitcoinKit.framework) 包含在我的库中,在 Package.swift 中引用它,但这不起作用,因为 SPM 确实如此不(还?)支持二进制文件 (relevant Swift Forum Thread)。

那么我有哪些选择?

1) 等到有人聪明地修复了 BitcoinKit 中损坏的 SPM 支持(我自己尝试过但失败了),然后删除我的 Xcode 项目文件并完成向仅 SPM 的过渡,现在坚持使用 Carthage...

2) 尝试在通过 Xcode Add Package Dependency 功能安装的库中内部使用 SPM 包,并手动将这些版本与我在 Package.swift 中声明的版本同步。这甚至会起作用吗?呃,无论如何,糟糕的解决方案。

3) 希望在 SPM 支持时将通过 Carthage 构建的 BitcoinKit.framework 包含为二进制文件?什么时候?可能需要一段时间?

4) BitcoinKit 也适用于 Cocoapods,但我想这让我无处可去,实际上更糟糕的是,因为 Cocoapods 创建了一个.xcworkspace 文件。

5) 等到 Apple 希望(有人知道是否有任何计划吗?)进行更改,以便我们通过 Package.swift 文件包含 Swift 包,即使与 Xcode 项目文件一起使用?我们可以通过 Carthage 继续使用 Bitcoinkit,并且只在一个地方声明我的 SPM 包,我猜 SPM/Xcode/Swift 将负责将依赖项集成到我的 Xcode 项目中,但通过Package.swift 文件进行更新和管理。 ..?

6) 任何其他替代方案,真正的解决方案?

【问题讨论】:

    标签: ios swift xcode carthage swift-package-manager


    【解决方案1】:

    在没有深入研究“使 bitcoinkit 与 SPM 一起工作”这一点的情况下,我认为“链接迦太基预构建二进制文件”的想法至少作为一种临时解决方案听起来最好。

    目前还不能在包清单中链接二进制文件,但您可以在构建时链接它: 在使用swift build 从命令行构建SPM 包时,如果您正在链接框架,您可以使用-Xswiftc-Xlinker 链接二进制文件以传递参数-F path/to/bitcoinkit。请记住,每个参数之前必须有一个交叉参数标志。 在 Xcode 中构建时,您应该能够使用带有内容的 .xcconfig 来解决它:

    FRAMEWORK_SEARCH_PATHS = path/to/bitcoinkit
    

    您可能需要稍微调整一下,但我想这应该可行,最坏的情况是由swift package generate-xcodeproj --xcconfig-overrides myconfig.xcconfig 生成单独的.xcodeproj

    【讨论】:

    • 请注意,XCode 12 出来了,您现在可以在包中链接Binary
    • @itMaxence 你是说我可以将本地 swift 包与预编译的 xcframework 链接起来吗?这是怎么做到的?
    【解决方案2】:

    GitHub 上的yenom/BitcoinKit 中有一个WalletExample。它带有一个工作区和项目。

    我能够在我的 Package.swift 中包含有 SPM 的yenom/BitcoinKit,但我没有使用任何项目/工作区。

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 2017-11-06
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      相关资源
      最近更新 更多