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

时间:2017-12-12 23:58:30

标签: swift xcode swift-package-manager

有没有办法为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或其他内容的任何解决方案都难以捉摸。

4 个答案:

答案 0 :(得分:14)

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

  1. 使用swift package generate-xcodeproj
  2. 设置macOS目标
  3. 隐藏swift build -Xswiftc "-target" -Xswiftc "x86_64-…"
  4. <强>设置

    修改并source ~/.bash_profileswiftxcodeswiftbuildswifttest别名添加到命令行。

    ###################################
    ### 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
    

    注意:可选地,BuildSettingExtractor (xcodeproj → xcconfig)创建的James Dempsey可以帮助您探索要添加到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. 可能需要在Xcode项目中手动设置某些xcconfig值,例如SKIP_INSTALL
    4. <强>路线图

      希望上面显示的当前有限xcconfig方法可以通过在包清单中指定自定义构建设置来取代,如Swift 4 Package Manager Roadmap中所述。

        

      配置文件支持

           

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

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

      <强>资源

答案 1 :(得分:1)

如果官方swift工具不允许某些Xcode项目操作,您可能希望重新编写将为您更新生成的Xcode项目的脚本。

你可以使用 xcodeproj rubygem。 请参阅an example script

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

答案 2 :(得分:1)

Swift进化提案SE-0236添加了每个平台的最低所需部署目标的配置:

// swift-tools-version:5.0
import PackageDescription

let package = Package(
    name: "MyTool",
    platforms: [
       .macOS(.v10_13),
    ],
     targets: [
        .target(name: "MyTool", dependencies: ["foo", "bar"]),
    ],
    swiftLanguageVersions: [.v5]
)

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

答案 3 :(得分:0)

不使用第三方工具即可实现的步骤。

1)在 / Sources 文件夹中创建具有以下内容的 macos.xcconfig 文件

MACOSX_DEPLOYMENT_TARGET = 10.12

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

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