3.1.3 解决依赖失败
2 分钟阅读
原文链接: https://docs.swift.org/latest/documentation/packagemanagerdocs/resolvingdependencyfailures/
3.1.3 解决依赖失败
了解各种依赖失败的场景。
概述
在把依赖添加到包中时,你会为它们定义约束,而这些约束并不总能被满足。
在运行构建或测试之前,或者当你运行 swift package resolve 时,包管理器会遍历你的包中的依赖,以及它们递归的所有依赖,从而构建出一份完整列表。然后它会尝试为每个依赖选出一个版本,使其既符合你的包的约束,也符合你的依赖所提供的任何约束。
如果所有依赖都可用并且已解析,这些版本会被记录在本地文件 Package.resolved 中。你可以用 swift package show-dependencies 命令查看这些依赖,它会给出整套依赖的一份简要列表。
如果依赖无法解析,例如你的包所依赖的各个包之间存在冲突的约束,包管理器会返回一个错误,说明冲突的约束:
error: Dependencies could not be resolved because root depends on 'pkgb' 0.1.0.
'pkgb' 0.1.0 cannot be used because 'pkgb' 0.1.0 depends on 'pkga' 0.3.0 and root depends on 'pkga' 0.4.0.
请调整你的依赖,或者更新你想依赖的包,来消除任何冲突的约束。
失败场景
可能出现多种场景,包括:
版本号不当:某个包可能为一次发布指定了不合适的版本号。例如,某个版本被标记为
1.2.3,却引入了大量破坏性 API 变更,本应通过把主版本号提升到2.0.0来体现。主版本要求不兼容:某个包的多个依赖对同一个包提出了不兼容的版本要求。例如,如果
Foo依赖Baz的~>1.0版本,而Bar依赖Baz的~>2.0版本,那么就不存在任何一个Baz版本能同时满足这两个要求。这种情况常常出现在某个被许多包共享的依赖更新到新的主版本,而所有这些包都需要很长时间才能更新它们的依赖时。次版本或更新版本要求不兼容:某个包的依赖被指定得过于严格,以致不同次版本或更新版本之间的版本要求互不兼容。例如,如果
Foo依赖Baz的==2.0.1版本,而Bar依赖Baz的==2.0.2版本,同样不存在任何一个Baz版本能同时满足这两个要求。这通常是某个依赖的补丁版本引入回归,导致包把该依赖锁定到某个特定版本的结果。命名空间冲突:某个包可能有两个或多个同名的依赖。例如,一个
Person包同时依赖一个Addressable包(它定义了给人分配邮寄地址的协议),以及另一个Addressable包(它定义了正式称呼他人的协议)。软件损坏:某个包的某个依赖存在影响可用性、安全性或性能的未修复缺陷。这可能只是包维护者及时性问题,也可能是他们对这个包的预期存在分歧。
全局状态冲突:某个包可能有两个或多个依赖都假定自己独占访问同一份全局状态。例如,一个包在从某个文件路径读取的同时,可能无法容忍另一个包写入同一个文件路径。
包变为不可用:某个包所依赖的包变得不可用。这可能是由于源 URL 无法访问,或者维护者删除了已发布的某个版本。