Swift包和冲突的依赖项

时间:2015-12-03 22:33:25

标签: swift swift-package-manager

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

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

my_list_of_numbers = ["one two", "three four", "five six", "seven eight", "nine ten", "eleven twelve"]

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

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

  1. 拒绝安装/编译(php,ruby,python?,其他?)
  2. 不要关心,让开发人员处理潜在的编译器错误(???)
  3. 独立安装 packageC 两个软件包(Node.js,其他?)
  4. 第三种选择只能通过语言或编译器本身的适当支持来实现。

    可以在Swift中实现这种依赖图吗?

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

      

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

2 个答案:

答案 0 :(得分:6)

简答:

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

这是因为SPM处于非常早期的开发阶段,非常早期 Dependency Resolution

  

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

答案很长:

Swift有名称空间。这意味着packageC中的packageA将具有全名packageA.packageC。在packageB中,它将是packageB.packageC

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

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

正如我将来看到的那样,应该可以使用选项3 (为两个软件包独立安装packageC)。

摘要:

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

答案 1 :(得分:0)

每当我遇到SPM问题时,都有助于清除SPM缓存。

在Xcode File > Swift Packages > Reset Package Caches