如何在多个内部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。
方法二:创建专用的工具依赖包
这种方式能获得完整的语法提示和类型检查,适合复杂的共享逻辑:
- 创建一个新的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")] ) ] ) - 在该包的
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 ) } - 在其他内部包的
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
相关产品推荐
相关产品推荐

