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

如何在多个内部Package.swift文件之间共享代码?

如何在多个内部Swift Package的Package.swift中共享自定义代码

我的项目包含大量内部Swift Packages,每个Package.swift文件都需要重复定义通用的Swift Settings扩展、产物生成辅助函数、单元测试目标模板等代码,比如:

extension [SwiftSetting] {
    /// A default set of Swift settings to enable for modules.
    static let `default`: [SwiftSetting] = [
        .existentialAny,
        .internalImportsByDefault
    ]
}

重复编写这些内容效率极低,想了解是否能像导入PackageDescription一样,导入自定义的共享代码集合来简化流程。


可行解决方案

方法一:用Swift预处理器#include引入共享文件

  • 将所有通用代码整理到一个单独的Swift文件(比如SharedPackageUtils.swift),放在项目根目录或公共路径下。
  • 在需要使用的Package.swift顶部添加预处理器指令,引入该文件:
    #include("../SharedPackageUtils.swift")
    
    注意根据实际文件位置调整路径,确保能正确定位到共享文件。
  • 引入后即可直接使用共享代码,无需额外导入,比如直接调用[SwiftSetting].default。

方法二:创建专用的工具依赖包

这种方式能获得完整的语法提示和类型检查,适合复杂的共享逻辑:

  1. 创建一个新的Swift Package(比如命名为SPMCommonTools),其Package.swift配置如下:
    import PackageDescription
    
    let package = Package(
        name: "SPMCommonTools",
        products: [
            .library(name: "SPMCommonTools", targets: ["SPMCommonTools"])
        ],
        targets: [
            .target(
                name: "SPMCommonTools",
                swiftSettings: [.define("PACKAGE_DESCRIPTION")]
            )
        ]
    )
    
  2. 在该包的Sources/SPMCommonTools目录下编写共享代码,示例:
    import PackageDescription
    
    extension Array where Element == SwiftSetting {
        static let `default`: [SwiftSetting] = [
            .existentialAny,
            .internalImportsByDefault
        ]
    }
    
    // 示例:生成默认测试目标的辅助函数
    func makeDefaultTestTarget(for targetName: String) -> Target {
        return .testTarget(
            name: "\(targetName)Tests",
            dependencies: [.target(name: targetName)],
            swiftSettings: .default
        )
    }
    
  3. 在其他内部包的Package.swift中,添加该工具包为依赖并导入使用:
    import PackageDescription
    import SPMCommonTools
    
    let package = Package(
        name: "MyInternalPackage",
        products: [.library(name: "MyInternalPackage", targets: ["MyInternalPackage"])],
        dependencies: [
            .package(path: "../SPMCommonTools") // 用相对路径引用内部工具包
        ],
        targets: [
            .target(
                name: "MyInternalPackage",
                swiftSettings: .default
            ),
            makeDefaultTestTarget(for: "MyInternalPackage")
        ]
    )
    

两种方法对比

  • #include方式:实现简单,无需额外构建流程,适合轻量共享逻辑;缺点是编辑时无语法提示,路径管理需注意一致性。
  • 工具依赖包方式:有完整的类型检查和IDE提示,适合复杂的通用代码;缺点需要维护额外的包,首次使用需构建。

内容的提问来源于stack exchange,提问作者Nicolas Gimelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:57:23