为`swiftpackagegenerate-xcodeproj`设置macos目标?(代码片段)

author author     2023-05-13     822

关键词:

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

例如,将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)

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

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

到目前为止,使用Package.swift--xcconfig-overrides或其他任何解决方案都难以实现。

答案

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

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

建立

编辑和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"'

使用Swift Package Manager工具版本4编辑项目中的Package.swift

// 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项目中的目标级别设置Build Settings值。整个项目级别的“构建设置”值保持不变。
  2. Package.xcconfig项目值对所有目标设置相同。目前似乎没有基于每个目标的xcconfig机制。
  3. 某些xcconfig值,例如SKIP_INSTALL,可能需要在Xcode项目中手动设置。

路线图

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

配置文件支持

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

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

资源

另一答案

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

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

看一个相关的问题Swift Package Manager and Xcode: Retaining Xcode Settings?

另一答案

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

1)使用以下内容在/ Sources文件夹中创建macos.xcconfig文件

MACOSX_DEPLOYMENT_TARGET = 10.12

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

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

码农八荣八耻

以动手实践为荣,以只看不练为耻;以打印日志为荣,以单步跟踪为耻;以空格缩进为荣,以制表缩进为耻;以单元测试为荣,以人工测试为耻;以模块复用为荣,以复制粘贴为耻;以多态应用为荣,以分支判断为耻;以干净利... 查看详情

无法获取大小为 16 的值。编码为 ?=CGPoint=ddd 的类型预计为 24 字节

】无法获取大小为16的值。编码为?=CGPoint=ddd的类型预计为24字节【英文标题】:Cannotgetvaluewithsize16.Thetypeencodedas?=CGPoint=dddisexpectedtobe24bytes无法获取大小为16的值。编码为?=CGPoint=ddd的类型预计为24字节【发布时间】:2021-09-0912:29:06... 查看详情

电工基础知识符号都有哪些?

电工基础知识符号自动重合闸装置文字符号为(ARD)电容,、电容器文字符号为(C)避雷器文字符号为、(F)、熔断器文字符号为(FU)发电机,、电源文字符号为(G)指示灯,、信号灯文字符号为(HL)、继电器,接触器的... 查看详情

python中的运算符(代码片段)

1.Python算术运算符运算符描述示例+两个数相加2+3结果为5-两个数相减2-3结果为-1*两个数相乘2*3结果为6/两个数相除,返回浮点数2/3结果为0.6666666666666666//两个数相除,返回整数2//3结果为0%取模,返回除法的余数2%3结果为2**幂,返回... 查看详情

pandas把dataframe的数据列转化为索引列实战:单列转化为索引多列转化为复合索引

pandas把dataframe的数据列转化为索引列实战:单列转化为索引、多列转化为复合索引目录 查看详情

为啥applicationFrame高度为460时窗口高度为480?

】为啥applicationFrame高度为460时窗口高度为480?【英文标题】:Whyisheightofwindow480whenapplicationFrameheightis460?为什么applicationFrame高度为460时窗口高度为480?【发布时间】:2013-02-1304:08:07【问题描述】:我在AppDelegate类中创建了一个TabBa... 查看详情

为啥 == false 评估为 false 而 [] == false 评估为 true?

】为啥==false评估为false而[]==false评估为true?【英文标题】:Whydoes==falseevaluatetofalsewhile[]==falseevaluatestotrue?为什么==false评估为false而[]==false评估为true?【发布时间】:2015-03-1508:56:01【问题描述】:为什么==false在javascript中计算为fal... 查看详情

声明为不可为空的 Kotlin 属性即使具有初始化值也可以为空

】声明为不可为空的Kotlin属性即使具有初始化值也可以为空【英文标题】:Kotlinpropertydeclaredasnon-nullableisnullableevenifithasinitializedvalue【发布时间】:2020-06-1923:14:14【问题描述】:这是一个非常有趣的情况。我有一些android自定义视... 查看详情

普法知识(43):法定职责必须为法无授权不可为

普法知识(43):法定职责必须为、法无授权不可为2014年9月6日,习主席在庆祝全国人民代表大会成立60周年大会上说:“要深入推进依法行政。加快建设法治政府。各级行政机关必须依法履行职责,坚持法定职责必须为、法无... 查看详情

当我将基数为 10 的数字转换为基数为 2 的数字时,为啥位会重复?

】当我将基数为10的数字转换为基数为2的数字时,为啥位会重复?【英文标题】:WhydobitsrepeatwhenIconvertabase-10numberintoabase-2number?当我将基数为10的数字转换为基数为2的数字时,为什么位会重复?【发布时间】:2021-10-1511:07:08【问... 查看详情

为啥 list 应该先转换为 RDD 再转换为 Dataframe?有啥方法可以将列表转换为数据框?

】为啥list应该先转换为RDD再转换为Dataframe?有啥方法可以将列表转换为数据框?【英文标题】:WhylistshouldbeconvertedtoRDDandthenDataframe?isthereanymethodtoconvertlisttodataframe?为什么list应该先转换为RDD再转换为Dataframe?有什么方法可以将列... 查看详情

java为jersery添加json支持(jersery实际上将对象转换为xml然后转换为json,以下示例为mediatyp(代码片段)

查看详情

python将中文大写数字转为阿拉伯数字

参考技术A平时会碰到把中文大写的金额转为阿拉伯数字,比如叁仟伍佰陆拾玖元肆角需要转为3569.4,尝试编写函数如下:上例测试输出为:八转换为阿拉伯数字为8十一转换为阿拉伯数字为11一百二十三转换为阿拉伯数字为123一... 查看详情

将存储为数字的时间转换为字符串

】将存储为数字的时间转换为字符串【英文标题】:Converttimestoredasnumbertostring【发布时间】:2015-08-0708:11:51【问题描述】:我有一个以数字形式存储某些时间的数据库表,例如,凌晨3:30存储为330,下午4点存储为1600,我想将这些... 查看详情

指定为非空的参数为空:无法更新 Spring Boot jpa 中的单个实体字段。导致指定为非空的参数为空

】指定为非空的参数为空:无法更新SpringBootjpa中的单个实体字段。导致指定为非空的参数为空【英文标题】:Parameterspecifiedasnon-nullisnull:Can\'tUpdateindividualEntityfieldinSpringBootjpa.CausedParameterspecifiedasnon-nullisnull【发布时间】:2021-06-01... 查看详情

当总计为正数时将订单计为“订单”,但当总计为负数时计为“退货”

】当总计为正数时将订单计为“订单”,但当总计为负数时计为“退货”【英文标题】:CountOrdersas"Orders"whentotalispostive,butas"Returns"whentotalisnegative【发布时间】:2021-03-2415:32:22【问题描述】:我正在处理一个查询以... 查看详情

为你写诗

...我开始全身不受控制爱情是一种本事我开始连自己都不是为你我做了太多的傻事第一件就是为你写诗为你写诗为你静止为你做不可能的事为你我学会弹琴写词为你失去理智为你写诗为你静止为你做不可能的事为你弹奏所有情歌的... 查看详情

编程工作准则

编程的八荣八耻以动手实践为荣,以只看不练为耻。以打印日志为荣,以出错不报为耻。以局部变量为荣,以全局变量为耻。以单元测试为荣,以手工测试为耻。以代码重用为荣,以复制粘贴为耻。以多态应... 查看详情