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 包管理器混合语言源文件的主要内容,如果未能解决你的问题,请参考以下文章

Swift 正式开源, 包括 Swift 核心库和包管理器

不能在带有 Xcode 11 包管理器的 Swift 包中包含 C 文件

我可以使用Swift包管理器创建本地模块吗?

添加对 Swift 包管理器的支持无法正确构建

如何使用 Swift 包管理器从 repo 中排除文件/文件夹?

Swift 包管理器教程