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,但使用不同的主要版本标识符.对于大多数语言生态系统而言,这成为一个问题 - 主要的版本冲击通常意味着对代码进行了更改,这些更改与以前的主要版本不向后兼容.
根据语言/编译器/其他相关组件的技术功能,可以通过以下方式之一实现包管理器:
第三种选择只能通过语言或编译器本身的适当支持来实现.
换句话说,packageA在技术上是否可以拥有(和使用)packageC 1.0.0版,而packageB将拥有2.0.0版本?
鉴于最近宣布Swift现在是开源的并且自带一个软件包管理器,我认为这个问题对于对Swift软件包开发感兴趣的未来读者可能非常有价值.
现在它是选项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)工作.
摘要:
| 归档时间: |
|
| 查看次数: |
2315 次 |
| 最近记录: |