Swift 包管理器混合语言源文件

Swift Package Manager Mixed Language Source Files

出于某种原因,当我尝试 运行 swift build 我的 Package.swift file: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",
                ]
        )
    ] )

我遇到以下错误:

error: target at '.../mobile-HDISegurado-ios' contains mixed language source files; feature not supported

更多详情:

您正在使用 SPM 构建 iOS 项目吗?目前 SPM 没有 iOS 支持。虽然,有一个第 3 方工具可以填补这个空白:https://swiftxcode.github.io/

如果您正在为其他人构建,那么您不能将 Swift 文件和其他 C 系列语言文件混合。我遇到了同样的问题,因为我的目标路径中有一个 Objective-C 文件。我所做的只是将文件名包含在 exclude 数组中。

因此,如果您在“mobile-HDISegurado-ios”中有一个文件,请务必忽略 Objective-C 类,方法是在 exclude 参数中传递文件名。

2021 年解决方案 - Xcode 11 岁及以上

此外,如果您在 Objective-C 项目或工作区中添加了 Swift 文件,但后来删除了所有 Swift 文件,Xcode 仍会在构建设置下保留一些条目。检查 Swift 相关选项,如下所示:

  • SWIFT_INSTALL_OBJC_HEADER
  • SWIFT_OPTIMIZATION_LEVEL
  • SWIFT_VERSION

如果您删除这些选项,Xcode 将不再出现错误,您可以安全地安装您的软件包。

测试:

  • swift-tools-version:5.1及以上
  • Xcode 11.3 及以上

最佳。

SPM 现在支持混合语言源文件,但您可能必须将它们分成多个目标。

来自the relevant docs

Targets can contain Swift, Objective-C/C++, or C/C++ code, but an individual target can’t mix Swift with C-family languages. For example, a Swift package can have two targets, one that contains Objective-C, Objective-C++, and C code, and a second one that contains Swift code.

实际上,您应该将 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"
)