在 Swift 包管理器中将依赖项添加到二进制目标
Add dependencies to binary targets in Swift Package Manager
我想创建一个 Swift 包含具有子依赖项的二进制目标的包。由于二进制目标不支持开箱即用的子依赖项,因此我创建了一个包装器目标,它依赖于二进制框架和其他依赖项,如 here
所述
包有一个名为 Logger
的目标。
CocoaLumberjack
是 Logger
的依赖项。
Logger
我已生成 XCFramwork 并托管在服务器中以供公开访问。下面我添加了我用来生成 XCFramwork 的 Xcode 项目的屏幕截图。
请参考包清单文件。
import PackageDescription
let package = Package(
name: "spmpoc",
products: [
.library(
name: "Logger",
targets: ["LoggerTarget"]),
],
dependencies: [
.package(
name: "CocoaLumberjack",
url: "https://github.com/CocoaLumberjack/CocoaLumberjack.git",
from: "3.6.1"),
],
targets: [
.target(
name: "LoggerTarget",
dependencies: [.target(name: "LoggerWrapper",
condition: .when(platforms: [.iOS]))]
),
.target(
name: "LoggerWrapper",
dependencies: [
.target(name: "Logger", condition: .when(platforms: [.iOS])),
.product(name: "CocoaLumberjack", package: "CocoaLumberjack")
]
),
.binaryTarget(name: "Logger", url: "https://mypath.com/Logger.xcframework.zip", checksum: "mychecksum")
]
)
我可以通过 Swift 包管理器添加 Swift 包,但是当我尝试导入 Logger
模块构建错误时发生 ..../Logger.framework/Modules/Logger.swiftmodule/arm64-apple-ios.swiftinterface:4:8: No such module 'CocoaLumberjack'
有人可以帮我弄清楚这里可能是什么问题吗?
错误
XCFramwork代码截图供参考
更新:
我在 Logger.swift 中将导入更改为 @_implementationOnly 导入。现在在生成的 .swiftinterface 文件中不包含“import CocoaLumberjack”因此,编译错误消失了。但是,应用程序崩溃,因为它仍在寻找 CocoaLumberjack.framework 但它不可用。 '.../Library/Developer/Xcode/DerivedData/TestSPMApp-gfbagjtzjrrkjuathrrienvklwxs/Build/Products/Debug-iphonesimulator/CocoaLumberjack.framework/CocoaLumberjack' (no such file)
CocoaLumberJack 作为 pod 依赖项添加到 Logger 框架。看起来,在 Pods-Logger.xcconfig 文件中它指的是 CocoaLumberjack.framework。我相信这会导致现在的问题。
我认为这里真正的问题是依赖项不需要成为模块 public 接口的一部分。您需要将代码中依赖关系的 import
的所有实例替换为 @_implementationOnly import
例如
@_implementationOnly import CocoaLumberjack
您可以阅读更多关于 @_implementationOnly
here
我想创建一个 Swift 包含具有子依赖项的二进制目标的包。由于二进制目标不支持开箱即用的子依赖项,因此我创建了一个包装器目标,它依赖于二进制框架和其他依赖项,如 here
所述包有一个名为 Logger
的目标。
CocoaLumberjack
是 Logger
的依赖项。
Logger
我已生成 XCFramwork 并托管在服务器中以供公开访问。下面我添加了我用来生成 XCFramwork 的 Xcode 项目的屏幕截图。
请参考包清单文件。
import PackageDescription
let package = Package(
name: "spmpoc",
products: [
.library(
name: "Logger",
targets: ["LoggerTarget"]),
],
dependencies: [
.package(
name: "CocoaLumberjack",
url: "https://github.com/CocoaLumberjack/CocoaLumberjack.git",
from: "3.6.1"),
],
targets: [
.target(
name: "LoggerTarget",
dependencies: [.target(name: "LoggerWrapper",
condition: .when(platforms: [.iOS]))]
),
.target(
name: "LoggerWrapper",
dependencies: [
.target(name: "Logger", condition: .when(platforms: [.iOS])),
.product(name: "CocoaLumberjack", package: "CocoaLumberjack")
]
),
.binaryTarget(name: "Logger", url: "https://mypath.com/Logger.xcframework.zip", checksum: "mychecksum")
]
)
我可以通过 Swift 包管理器添加 Swift 包,但是当我尝试导入 Logger
模块构建错误时发生 ..../Logger.framework/Modules/Logger.swiftmodule/arm64-apple-ios.swiftinterface:4:8: No such module 'CocoaLumberjack'
有人可以帮我弄清楚这里可能是什么问题吗?
错误
XCFramwork代码截图供参考
更新:
我在 Logger.swift 中将导入更改为 @_implementationOnly 导入。现在在生成的 .swiftinterface 文件中不包含“import CocoaLumberjack”因此,编译错误消失了。但是,应用程序崩溃,因为它仍在寻找 CocoaLumberjack.framework 但它不可用。 '.../Library/Developer/Xcode/DerivedData/TestSPMApp-gfbagjtzjrrkjuathrrienvklwxs/Build/Products/Debug-iphonesimulator/CocoaLumberjack.framework/CocoaLumberjack' (no such file)
CocoaLumberJack 作为 pod 依赖项添加到 Logger 框架。看起来,在 Pods-Logger.xcconfig 文件中它指的是 CocoaLumberjack.framework。我相信这会导致现在的问题。
我认为这里真正的问题是依赖项不需要成为模块 public 接口的一部分。您需要将代码中依赖关系的 import
的所有实例替换为 @_implementationOnly import
例如
@_implementationOnly import CocoaLumberjack
您可以阅读更多关于 @_implementationOnly
here