SPM构建报错:target中依赖项需显式声明如何解决
问题描述
使用SPM为项目/App添加软件包,在Package.swift文件中为target配置依赖项后,每次构建应用都会触发报错。
原有错误配置
// swift-tools-version:5.5 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "Sycra", products: [ .library( name: "Sycra", targets: ["Sycra"]), ], dependencies: [ .package(url: "https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library", .upToNextMinor(from: "3.2.0")) ], targets: [ define a module or a test suite. .target( name: "Sycra", dependencies: ["NordicMesh"]), .testTarget( name: "SycraTests", dependencies: ["Sycra"]), ] )
项目文件结构

报错信息
dependency 'NordicMesh' in target 'Sycra' requires explicit declaration; reference the package in the target dependency with '.product(name: "NordicMesh", package: "IOS-nRF-Mesh-Library")'
问题原因
Swift 5.2及以上版本的SPM要求,引用外部包的产品作为依赖时,不能直接在target依赖项里写模块名字符串,必须显式声明该依赖产品所属的外部包名。另外原有配置中target块上方的说明文字没有加//注释前缀,也会触发语法错误。
修复方案
修改Package.swift文件,做两处调整:
- 给target块上方的说明文字加上
//前缀,标记为合法注释 - 把Sycra target下的依赖从直接写
"NordicMesh",替换为显式的product声明,明确指定依赖所属的外部包名
修改完成后的完整可用配置如下:
// swift-tools-version:5.5 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "Sycra", products: [ .library( name: "Sycra", targets: ["Sycra"]), ], dependencies: [ .package(url: "https://github.com/NordicSemiconductor/IOS-nRF-Mesh-Library", .upToNextMinor(from: "3.2.0")) ], targets: [ // define a module or a test suite. .target( name: "Sycra", dependencies: [ .product(name: "NordicMesh", package: "IOS-nRF-Mesh-Library") ]), .testTarget( name: "SycraTests", dependencies: ["Sycra"]), ] )
保存文件后重新执行SPM依赖拉取、构建项目即可正常编译。
内容的提问来源于stack exchange,提问作者asapsonter
相关产品推荐
相关产品推荐

