Swift包和冲突的依赖项

Rob*_*ann 12 swift swift-package-manager

我见过的每个包管理器最具挑战性的任务之一是处理冲突的依赖项.

让我们使用以下虚构的应用程序SwiftApp,它取决于一些第三方软件包.

- SwiftApp - packageA@latest - packageC@1.0.0 - packageD@latest - packageB@latest - packageC@2.0.0 - packageE@latest

从上面的依赖图中,我们可以看到SwiftApp的两个依赖项都使用packageC,但使用不同的主要版本标识符.对于大多数语言生态系统而言,这成为一个问题 - 主要的版本冲击通常意味着对代码进行了更改,这些更改与以前的主要版本不向后兼容.

根据语言/编译器/其他相关组件的技术功能,可以通过以下方式之一实现包管理器:

  1. 拒绝安装/编译(php,ruby,python?,其他?)
  2. 不关心,让开发人员处理潜在的编译器错误(???)
  3. 独立为两个软件包安装packageC(Node.js,其他?)

第三种选择只能通过语言或编译器本身的适当支持来实现.

可以在没有Swift破坏的情况下实现这种依赖图吗?

换句话说,packageA在技术上是否可以拥有(和使用)packageC 1.0.0版,而packageB将拥有2.0.0版本?

鉴于最近宣布Swift现在是开源的并且自带一个软件包管理器,我认为这个问题对于对Swift软件包开发感兴趣的未来读者可能非常有价值.

Kos*_*val 6

简短回答:

现在它是选项2,无法构建.
它给出了一个错误: swift-build: The dependency graph could not be satisfied

这是因为SPM处于早期开发阶段,非常早期测试版.
依赖性解决方案

Swift包管理器当前不提供自动解决依赖关系树中的冲突的机制.但是,这将在未来提供.

答案很长:

Swift有名称空间.这意味着packageCin packageA会有一个全名packageA.packageC.而在packageB这将是packageB.packageC

因此,可以不止一次地包含相同的框架.
SPM还使用版本后缀(packageC-1.0.0)获取依赖项.所以我认为应该可以检查特定包中需要什么版本并获取它.

Swift也支持动态框架.这意味着您可以拥有相同框架的许多版本,并且它们不应相互冲突.

正如我将来看到的那样,应该可以使用 Option 3(两个软件包独立安装packageC)工作.

摘要:

  • 现在:选项2 - 无法构建.
  • 未来:选项3 - 独立安装两个版本

  • 有没有人知道这个版本是否随着Swift 4 spm的新版本发生了变化?我找不到一个明确的答案.. (3认同)