3.1.1 解析与更新依赖
2 分钟阅读
原文链接: https://docs.swift.org/latest/documentation/packagemanagerdocs/resolvingpackageversions/
3.1.1 解析与更新依赖
为你的包协调并约束依赖。
概述
包管理器把依赖解析的结果记录在包顶层名为 Package.resolved 的文件中。当该文件存在,并且你正在为依赖树的顶层(叶子)包解析依赖时,包管理器会把 Package.resolved 文件用作各依赖版本的缓存。对于作为库使用、或作为另一个 Swift 项目依赖而引入的包,Package.resolved 文件并不会固定它们所依赖的版本。如果该包是作为另一个包的依赖被解析的,那么它自己的 Package.resolved 文件在那次解析中会被忽略。
大多数 SwiftPM 命令在运行之前都会隐式调用依赖解析,如果依赖无法解析,就会以错误中止。
解析依赖
运行 swift package resolve 来解析依赖,它会考虑 Package.swift 清单中当前的版本约束以及 Package.resolved 已解析版本文件。对于带有 Package.resolved 文件的包,只要那些版本仍然可选,resolve 命令就会解析到这些版本。如果你想显式使用写入 Package.resolved 的依赖,在调用 swift resolve 时使用 --force-resolved-versions。例如,要让依赖强制与 Package.resolved 中定义的版本保持一致,可以使用:
| |
如果已解析版本的这一文件发生了变化(例如队友通过源代码管理分享了更新),下一次 resolve 命令会尝试更新包依赖以与该文件匹配。大多数情况下,除非 Package.swift 清单或 Package.resolved 文件发生了变化,resolve 命令不会做任何改动。
更新依赖
运行 swift package update 把包的依赖更新到最新的可选版本,这同时也会更新 Package.resolved 文件。
为你的包协调各依赖的版本
你可以用 Package.resolved 为叶子 Swift 项目(也就是没有被用作依赖的项目)协调它所使用各依赖的版本。例如,你可以把 Package.resolved 文件纳入源代码管理,或者在本地解析它并把它传入容器镜像构建流程,以确保另一次构建使用相同的依赖版本。
对于叶子项目,Package.resolved 只能帮助把依赖解析到它所定义的特定版本。它不会为作为其他 Swift 项目依赖使用的库或包提供任何版本固定。例如,如果你的包提供了一个库并且检入了 Package.resolved,那么依赖你这个库的包会忽略这些版本,转而选择最新的可选版本。关于约束依赖版本的更多信息,参见为 Swift 包添加依赖。
如果 Package.resolved 不存在,每个用户或构建系统都会各自解析依赖版本,只在他们运行 swift package update 时才更新,而新用户会从每个依赖最新的可选版本开始。如果 Package.resolved 文件确实存在,那么任何需要依赖的命令(例如 swift build 或 swift run)都会尝试解析该文件中记录的依赖版本。