SPM嵌套依赖版本管控:如何强制指定嵌套依赖SDK的版本?
SPM嵌套依赖版本管控:如何强制指定嵌套依赖SDK的版本?
嗨,这个场景我之前也碰到过!刚好可以给你分享两个SPM原生支持的实用办法,不用额外工具就能解决:
方法一:在App的Package.swift中显式声明指定版本的SDK_B
SPM的依赖解析规则是顶层项目显式声明的依赖优先级更高,只要你指定的SDK_B版本满足SDK_A的版本要求(比如你的例子里SDK_A要求SDK_B >=1.0.0,1.2.2完全符合),就会优先使用你指定的版本。
具体操作就是在你的App项目的Package.swift里,同时添加SDK_A 1.2.2和SDK_B 1.2.2的依赖声明:
dependencies: [ .package(url: "https://your-repo/SDK_A.git", exact: "1.2.2"), .package(url: "https://your-repo/SDK_B.git", exact: "1.2.2") ]
之后在target的依赖里只需要添加SDK_A就行,SDK_B会因为SDK_A的嵌套依赖自动关联,但会使用你指定的1.2.2版本。
方法二:使用SPM的依赖覆盖(Dependency Overrides)
如果你不想把SDK_B变成App的直接依赖,这个方法更合适——专门用来强制覆盖嵌套依赖的版本,不用在顶层显式添加SDK_B为直接依赖。
在你的App的Package.swift里,在package定义的末尾加上依赖覆盖的代码:
let package = Package( name: "YourApp", dependencies: [ .package(url: "https://your-repo/SDK_A.git", exact: "1.2.2") ], targets: [ .target( name: "YourAppTarget", dependencies: [.product(name: "SDK_A", package: "SDK_A")] ) ] ) // 强制覆盖SDK_B的版本为1.2.2 package.dependenciesOverride = [ .package(url: "https://your-repo/SDK_B.git", exact: "1.2.2") ]
这个方式相当于给SPM下了个“死命令”:不管哪个嵌套依赖用到SDK_B,都必须用1.2.2版本,同样要保证这个版本满足SDK_A的版本约束哦。
重要注意点
不管用哪种方法,都要确保你指定的SDK_B版本必须符合SDK_A对它的版本要求。比如如果SDK_A要求SDK_B >=1.2.3,那你强制用1.2.2就会触发依赖解析失败,SPM会直接报错提示版本不兼容。
备注:内容来源于stack exchange,提问作者Kireyin
相关产品推荐
相关产品推荐

