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

Posted

技术标签:

【中文标题】为`swift package generate-xcodeproj`设置macOS目标?【英文标题】:Set macOS target for `swift package generate-xcodeproj`? 【发布时间】:2017-12-12 23:58:30 【问题描述】:

有没有办法为swift package generate-xcodeproj 设置 macOS 目标生成 Xcode 项目?

例如,将默认目标设置为“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 的结果是一个 macOS 目标为 10.10 的 Xcode 项目。

注意:生成的 Xcode 10.10 目标是 swift 命令行编译器目标 10.9 的一个版本。因此,显然,swiftswift package generate-xcodeproj 的默认 macOS 目标是相互独立确定的。

到目前为止,任何带有Package.swift、--xcconfig-overrides 或其他东西的解决方案都难以捉摸。

【问题讨论】:

也在寻求解决方案。这同样适用于更好的方法:oleb.net/blog/2017/04/… @Klaas 仅供参考,我发布了swift package generate-xcodeproj…-Xswiftc "-target" -Xswiftc "x86_64… here 的解决方法 【参考方案1】:

斯威夫特 5

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

斯威夫特 4

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

    使用swift package generate-xcodeproj 设置macOS 目标,并且 隐藏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

注意事项

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

路线图

希望上面显示的当前受限的xcconfig 方法将被在包清单中指定自定义构建设置的能力所取代,如Swift 4 Package Manager Roadmap 中所述。

配置文件支持

我们正在考虑添加一种配置文件机制,该机制可以是特定于用户或特定于包的,以允许自定义某些包管理器行为。一个直接的用途是作为一种临时机制来传递包的重写编译器标志,尽管我们希望通过真正的构建设置模型来解决这个需求。配置文件的其他用途需要考虑。

另外值得注意的是,Apple 的“New Build System (Preview)”,用 Swift 编写并与 Xcode 9 一起发布,可以使用 xcconfig 文件来定义构建设置。

资源

Apple: Configuration Settings File (xcconfig) format New Xcode Build System and BuildSettingExtractor The Unofficial Guide to xcconfig files Five Things You Must Know About Xcode 10 New Build System

【讨论】:

【参考方案2】:

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”将“Deloyment Target”设置为 10.13。

【讨论】:

【参考方案3】:

如果官方的 swift 工具不允许某些 Xcode 项目操作,您可能需要编写一个脚本来为您更新生成的 Xcode 项目。

你可以使用 xcodeproj rubygem。 见an example script。

查看相关问题Swift Package Manager and Xcode: Retaining Xcode Settings?

【讨论】:

【参考方案4】:

无需第三方工具即可实现此目标的步骤。

1) 在 /Sources 文件夹中创建 ma​​cos.xcconfig 文件,内容如下

MACOSX_DEPLOYMENT_TARGET = 10.12

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

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

【讨论】:

以上是关于为`swift package generate-xcodeproj`设置macOS目标?的主要内容,如果未能解决你的问题,请参考以下文章

swift Swift 2 - FizzBu​​zz Generator

避免maven package 打包时执行 mybatis-generator-maven-plugin 插件

使用Java代码配置MyBatis Generator

Android A/B System - Generate OTA Package

从现有 Xcode 项目中为 Swift 包管理器导出 Package.swift

Swift Package Manager 重写 macOS 部署目标