如何在SPM中配置-package-name解决Swift包访问权限报错?
在Swift Package Manager中配置package访问修饰符解决编译错误
当你在Swift代码中使用package访问修饰符时,编译器需要明确哪些模块属于同一个包,这就必须通过-package-name参数指定。在Swift Package Manager(SPM)中,你可以通过修改Package.swift的目标配置来传递这个参数,具体操作如下:
1. 修改Package.swift配置
打开你的包定义文件Package.swift,为所有需要使用package修饰符的目标(包括测试目标)添加swiftSettings,传入-package-name参数,参数值要和你包的name字段完全一致:
// swift-tools-version: 5.9 import PackageDescription let package = Package( name: "PackageDemo", // 你的包名,将作为package-name的参数值 products: [ .library( name: "PackageDemoLibrary", targets: ["PackageDemoLibrary"]), ], dependencies: [], targets: [ .target( name: "PackageDemoLibrary", swiftSettings: [ .unsafeFlags(["-package-name", "PackageDemo"]) ]), .testTarget( name: "PackageDemoLibraryTests", dependencies: ["PackageDemoLibrary"], swiftSettings: [ .unsafeFlags(["-package-name", "PackageDemo"]) ]), ] )
2. 统一包内所有模块的package-name
如果你的包包含多个模块(多个target),所有属于该包的模块都需要添加上述配置,并且-package-name的参数值必须完全相同——只有这样,这些模块才能互相访问带有package修饰符的成员。
3. 验证代码编译
你的原代码本身没有问题,配置完成后即可正常编译:
public class PackageDemoLibrary { public init() {} public var publicVariable = "" package var packageVariable = "" }
此时,同一个包内的其他模块可以直接访问packageVariable,而包外的代码无法访问该成员,完全符合package访问修饰符的设计预期。
内容的提问来源于stack exchange,提问作者Naqeeb
相关产品推荐
相关产品推荐

