为 `swift package generate-xcodeproj` 设置 macOS 目标?

13

有没有一种方法可以在使用 swift package generate-xcodeproj 生成的 Xcode 项目中设置 macOS 的目标?

例如,将默认目标设置为 "x86_64-apple-macosx10.12"。

背景

目前,在命令行中使用 Xcode 9.2 Swift 工具链会显示以下版本:

swift --version
# Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
# Target: x86_64-apple-macosx10.9
swift package --version
# Apple Swift Package Manager - Swift 4.0.0-dev (swiftpm-13752)
swift package generate-xcodeproj 的结果是一个 Xcode 项目,其 macOS 目标版本为 10.10。
注意:生成的 Xcode 10.10 目标版本比 swift 命令行编译器的目标版本 10.9 高一个版本。因此,似乎 swiftswift package generate-xcodeproj 的默认 macOS 目标是相互独立确定的。
到目前为止,使用 Package.swift--xcconfig-overrides 或其他方法的任何解决方案都很难实现。

也在寻找解决方案。同样适用于更好的方法:https://oleb.net/blog/2017/04/swift-3-1-package-manager-deployment-target/ - Klaas
@Klaas,作为FYI,我在这里发布了我针对swift package generate-xcodeproj...-Xswiftc "-target" -Xswiftc "x86_64…的解决方法。 - l --marc l
4个回答

18

Swift 5.x

swift package generate-xcodeproj已不再可用。请参阅带有platforms: [ … ]的已接受答案,了解当前有效的方法。

Swift 5

Swift 5包管理器现在可以通过Package.swift中的platforms指定最低所需目标平台。...请参见Klaas提供的答案。

Swift 4

我最终创建了swiftxcodeswiftbuildswifttest bash别名作为简化的解决方法:

  1. 使用swift package generate-xcodeproj设置macOS目标,以及
  2. 隐藏swift build -Xswiftc "-target" -Xswiftc "x86_64-…"

设置

编辑并 source 〜/ .bash_profile 添加swiftxcodeswiftbuildswifttest 别名到命令行中。

###################################
### Swift Package Manager (SPM) ###
###################################
alias swiftxcode="swift package generate-xcodeproj --xcconfig-overrides Package.xcconfig"
alias swiftbuild='swift build -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.12"'
alias swifttest='swift test -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.12"'

编辑 Package.swift 文件,指定使用 Swift Package Manager 工具版本 4:

// swift-tools-version:4.0
import PackageDescription

let package = Package(

Package.xcconfig添加到项目文件夹中:

/// Package.xcconfig

/// macOS Deployment Target
/// 
/// Code will load on this and later versions of macOS. 
/// Framework APIs that are unavailable in earlier versions will be weak-linked; 
/// your code should check for `null` function pointers 
/// or specific system versions before calling newer APIs.

MACOSX_DEPLOYMENT_TARGET=10.12

注意:可选操作,由James Dempsey创建的BuildSettingExtractor (xcodeproj → xcconfig)可能对探索其他设置并添加到Package.xcconfig文件中有所帮助。

使用方法

cd to/some_project_folder/
swiftxcode     # create Xcode project
swiftbuild     # build from command line
swifttest      # build and run tests from command line

注意事项

  1. Package.xcconfig 仅在 Xcode 项目的目标级别上设置构建设置值。整个项目级别的构建设置值保持不变。
  2. Package.xcconfig 项目值对于所有目标都是相同的。目前似乎没有针对每个目标的 xcconfig 机制。
  3. 某些 xcconfig 值,例如 SKIP_INSTALL,可能需要在 Xcode 项目中手动设置。

路线图

希望当前有限的 xcconfig 方法将被超越,通过在软件包清单中指定自定义构建设置来实现,如 Swift 4 Package Manager Roadmap 中所讨论的那样。

配置文件支持
我们正在考虑添加一个配置文件机制,可以是用户特定或包特定的,以允许自定义某些软件包管理器的行为。其中一个直接使用场景是作为传递覆盖包编译器标志的临时机制,尽管我们希望通过真正的构建设置模型来解决这个需求。配置文件的其他用途还在考虑中。
值得注意的是,苹果公司的“新构建系统(预览版)”,用Swift编写并随Xcode 9发布,可以使用xcconfig文件定义构建设置。
资源

9
Swift演进提案SE-0236增加了配置每个平台的最低部署目标的功能: (链接)
// swift-tools-version:5.0
import PackageDescription

let package = Package(
    name: "MyTool",
    platforms: [
        // specify each minimum deployment requirement, 
        //otherwise the platform default minimum is used.
       .macOS(.v10_13),
    ],
     targets: [
        .target(name: "MyTool", dependencies: ["foo", "bar"]),
    ],
    swiftLanguageVersions: [.v5]
)

这将导致Xcode项目中的目标"MyTool"的"部署目标"设置为10.13。

1

1

没有第三方工具的情况下实现此目标的步骤。

1)在/Sources文件夹中创建macos.xcconfig文件,其内容如下:

MACOSX_DEPLOYMENT_TARGET = 10.12

2)在您的项目根目录中运行此命令

swift package generate-xcodeproj --xcconfig-overrides Sources/macos.xcconfig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接