【问题标题】:Swift package manager: How best to indicate platform dependent code?Swift 包管理器:如何最好地指示平台相关代码?
【发布时间】:2020-08-27 01:11:22
【问题描述】:

Swift 包管理器 (SPM) 允许支持不同的平台(例如 iOS、macOS)。我正在调整一个 Swift 库以使用 SPM,需要共享一些 iOS 和 macOS 的代码,但也有一些差异。

我在 Facebook 库中看到过类似的示例: https://github.com/facebook/facebook-ios-sdk/blob/master/Package.swift 在这种情况下,他们使用多个目标,每个目标都有自己的(独立)代码。这不是平台依赖的例子,而是目标依赖的例子。

我看到了两条前进的道路:

1) 为 iOS 和 macOS 提供单独的库目标——并使用与 Facebook 类似的方法,但大部分代码将在目标之间共享。我不完全确定 SPM 是否允许跨目标共享代码。这里的缺点纯粹是语法糖——命名差异。不幸的是,您必须在 iOS 上导入“MyLibrary_iOS”,在 macOS 上导入“MyLibrary_macOS”。

2) 有一个适用于 iOS 和 macOS 的目标,但在源代码中嵌入条件编译以有条件地包含/排除特定文件。这没有上述命名问题。但是必须进行这种条件编译似乎是不干净的。

还有其他建议吗? 谢谢!

【问题讨论】:

标签: ios swift macos swift-package-manager


【解决方案1】:

等待即将发布的 Swift 5.3。这是通过SE-0273 添加的。

【讨论】:

  • 酷。让我尝试了解 SE-0273 在我的案例中的用途。我会建立三个目标,称它们为“Common”、“iOSSpecifics”和“MacOSSpecifics”——在后者中引用依赖的 .swift 文件。然后,我将无条件地引用“通用”目标,并从我感兴趣的主要目标有条件地引用另外两个目标。听起来对吗?
  • 我现在在 Xcode 12 beta 6 中使用它。出于某种原因需要进行一些手臂摔跤才能使构建发生而没有错误,但它正在工作!
  • @ChrisPrince 你有这方面的例子吗?我正在努力想象它是如何工作的!
  • 看看这个:github.com/SyncServerII/ServerAccount/blob/master/Package.swift 看看它是否有帮助。在为 iOS 构建时,我排除了三个依赖项(Kitura、HeliumLogger 和 Credentials)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多