Swift 包和冲突的依赖项

2024-02-12

我见过的每个包管理器中最具挑战性的任务之一就是处理冲突的依赖关系。

让我们研究以下假想的应用程序SwiftApp,这取决于一些第三方软件包。

- SwiftApp - packageA@latest - [email protected] /cdn-cgi/l/email-protection - packageD@latest - packageB@latest - [email protected] /cdn-cgi/l/email-protection - packageE@latest

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

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

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

第三个选项只有在语言或编译器本身的适当支持下才能实现。

在 Swift 中可以在不破坏的情况下实现这个依赖图吗?

换句话说,技术上是否可行packageA拥有(并使用)1.0.0 版本packageC while packageB会有2.0.0版本吗?

鉴于最近宣布 Swift 现已开源并附带自己的包管理器,我认为这个问题对于未来对 Swift 包开发感兴趣的读者可能非常有价值。


简短回答:

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

这是因为 SPM 处于非常早期的开发阶段,非常早期的测试版。
依赖解析 https://github.com/apple/swift-package-manager/blob/master/Documentation/PackageManagerCommunityProposal.md#dependency-resolution

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

长答案:

Swift 有命名空间。代表着packageC in packageA会有一个全名packageA.packageC。并且在packageB这将是packageB.packageC

因此,可以多次包含相同的框架。
SPM 还获取带有版本后缀 (packageC-1.0.0) 的依赖项。所以我认为应该可以检查特定包需要什么版本并获取它。

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

正如我所看到的,将来应该有可能Option 3(为两个独立的包安装 packageC)工作。

Summary:

  • 现在:选项 2 - 构建失败。
  • 未来:选项 3 - 独立安装两个版本
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 包和冲突的依赖项 的相关文章

随机推荐