You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:26:10