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

l -*_*c l 9 xcode swift swift-package-manager

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

例如,将default target设置为"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)
Run Code Online (Sandbox Code Playgroud)

结果swift package generate-xcodeproj是一个Xcode项目,macOS目标为10.10.

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

到目前为止,任何解决方案Package.swift,--xcconfig-overrides或别的东西一直难以捉摸.

l -*_*c l 15

我最终创建platforms,Package.swiftswiftxcodebash别名作为解决方法来简化:

  1. swiftbuild,和设置macOS目标
  2. swifttest

建立

编辑并swift package generate-xcodeproj swift build -Xswiftc "-target" -Xswiftc "x86_64-…"添加source,~/.bash_profileswiftxcode别名到命令行.

###################################
### 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"'
Run Code Online (Sandbox Code Playgroud)

swiftbuild使用Swift Package Manager工具版本4在项目中编辑以指定:

// swift-tools-version:4.0
import PackageDescription

let package = Package(…
Run Code Online (Sandbox Code Playgroud)

添加swifttest到项目文件夹:

/// 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
Run Code Online (Sandbox Code Playgroud)

注意:James Dempsey创建的BuildSettingExtractor(xcodeproj→xcconfig)可以帮助您探索要添加到文件的其他设置.Package.swift

使用

cd to/some_project_folder/
swiftxcode     # create Xcode project
swiftbuild     # build from command line
swifttest      # build and run tests from command line
Run Code Online (Sandbox Code Playgroud)

注意事项

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

路线图

希望xcconfig上面显示的当前有限方法可以通过在程序包清单中指定自定义构建设置的能力来取代,如Swift 4程序包管理器路线图中所述.

配置文件支持

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

另外值得注意的是,用Swift编写并随Xcode 9发布的Apple的"新构建系统(预览版)"可以使用SKIP_INSTALL文件来定义构建设置.

资源


Kla*_*aas 5

Swift Evolution提案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]
)
Run Code Online (Sandbox Code Playgroud)

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