Swift 包管理器混合语言源文件
Posted
技术标签:
【中文标题】Swift 包管理器混合语言源文件【英文标题】:Swift Package Manager Mixed Language Source Files 【发布时间】:2018-07-26 13:59:13 【问题描述】:由于某种原因,当我尝试在我的 Package.swift
文件上运行 swift build
时:import PackageDescription
let package = Package(
name: "mobile-HDISegurado-ios",
dependencies: [
.package(url: "https://github.com/watson-developer-cloud/swift-sdk", from: "0.30.0"),
],
targets: [
.target(
name: "mobile-HDISegurado-ios",
dependencies: ["WatsonDeveloperCloud"],
path: "mobile-HDISegurado-ios",
exclude: [
"Config",
"Public",
"Resources",
]
)
] )
我遇到以下错误:
错误:目标在 '.../mobile-HDISegurado-ios' 包含混合语言源文件;不支持的功能
更多细节:
swift package tools-version: 4.1.0 运行 Cocoapods 的项目工作区。【问题讨论】:
【参考方案1】:SPM 现在支持混合语言源文件,但您可能必须将它们分成多个目标。
来自the relevant docs:
目标可以包含 Swift、Objective-C/C++ 或 C/C++ 代码,但单个目标不能将 Swift 与 C 系列语言混合使用。例如,一个 Swift 包可以有两个目标,一个包含 Objective-C、Objective-C++ 和 C 代码,另一个包含 Swift 代码。
实际上,您应该将您的 ObjC/C/C++ 文件移动到一个目录,将您的 Swift 文件移动到另一个目录,然后修改您的 Package.swift:
products: [
.library(
name: "MyLibrary",
targets: ["MyLibrarySwift", "MyLibraryObjC"]),
],
.target(name: "MyLibraryObjC",
path: "Sources/MyLibraryObjC"
),
.target(name: "MyLibrarySwift",
path: "Sources/MyLibrarySwift"
)
【讨论】:
不应该是..targets: ["MyLibrarySwift", "MyLibraryObjC"],
吗?
你是对的,它应该。答案相应更新。谢谢
我一辈子都想不通我做错了什么——当我在Souces/MyLibrarySwift
的Swift文件中写import MyLibraryObjC
时,它只是说“没有这样的模块'MyLibraryObjC '”【参考方案2】:
2021 解决方案 - Xcode 11 及更高版本
此外,如果您在 Objective-C 项目或工作区中添加了 Swift 文件,但后来删除了所有 Swift 文件,Xcode 仍会在 Build Settings 下保留一些条目。检查 Swift 相关选项,如下行:
SWIFT_INSTALL_OBJC_HEADER SWIFT_OPTIMIZATION_LEVEL SWIFT_VERSION如果您删除这些选项,Xcode 将不会再出现错误,您可以安全地安装您的包而没有任何麻烦。
测试:
swift-tools-version:5.1 及以上 Xcode 11.3 及以上版本最好的。
【讨论】:
【参考方案3】:您是否正在使用 SPM 构建 iOS 项目?目前 SPM 不支持 iOS。虽然,有一个第 3 方工具可以填补这个空白:https://swiftxcode.github.io/
如果您正在为其他人构建,那么您不能将 Swift 文件和其他 C 系列语言文件混合在一起。我遇到了同样的问题,因为我的目标路径中有一个 Objective-C 文件。我所做的只是将文件名包含在 exclude
数组中。
因此,如果您在“mobile-HDISegurado-ios
”中有一个类,请确保忽略 Objective-C 类,方法是在 exclude
参数中传递文件名。
【讨论】:
以上是关于Swift 包管理器混合语言源文件的主要内容,如果未能解决你的问题,请参考以下文章
不能在带有 Xcode 11 包管理器的 Swift 包中包含 C 文件