博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[翻译练习] Swift Package Manager 重写 macOS 部署目标
阅读量:6588 次
发布时间:2019-06-24

本文共 1954 字,大约阅读时间需要 6 分钟。

译自:


Swift 3.1 修复了 无法重写 MacOS 部署目标的 Bug。

当你在 macOS 上执行 swift build 命令时,包管理器目前(Swift 3.0 和 3.1)会将部署目标硬编码为 macOS 10.10。¹ 在 Swift 3.0 中无法重写部署目标,被证明是由于命令参数的 引起的。

因此,你不能轻松编译用到了最新 API 的代码。² 举个栗子,假设有一个非常简单的包,只包含几行代码在一个源文件中。这个程序用到了 macOS 10.12 引入的新的来将一个值从以 km/h 为单位转换为以 m/s 为单位:

// main.swiftimport Foundationlet kph = Measurement(value: 100,    unit: UnitSpeed.kilometersPerHour)let mps = kph.converted(to: .metersPerSecond)print("\(kph) is \(mps)")复制代码

在 macOS(Swift 3.0 或 3.1)上用 swift build 命令编译上面这段代码会报错,因为这段代码用到的 API 在 macOS 10.10 上不可用:

$ swift buildCompile Swift Module 'Units' (1 sources)main.swift:3:11: error: 'Measurement' is only available on OS X 10.12 or newerlet kph = Measurement(value: 100,          ^main.swift:3:11: note: add 'if #available' version checklet kph = Measurement(value: 100,          ^...
:0: error: build had 1 command failureserror: exit(1): /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f .build/debug.yaml复制代码

在 Swift 3.1 中,你可以在命令行中修改部署目标,如下所示:

$ swift build -Xswiftc "-target" \    -Xswiftc "x86_64-apple-macosx10.12"Compile Swift Module 'Units' (1 sources)Linking ./.build/debug/Units复制代码

现在,你可以正常执行之前的这段代码了:

$ .build/debug/Units100.0 km/h is 27.7778 m/s复制代码

结论

除了部署目标,另一个常见的自定义编译设置例子是传递一个 DEBUG 标志给编译器,这样你就可以在你的代码中使用 #if DEBUG/#endif 代码段来判断是否处于 Debug 模式 - 包管理器并没有在 Debug 模式下自动完成这些工作。你可以通过 swift build -Xswiftc "-D" -Xswiftc "DEBUG" 命令实现这一目的。

这仍然不够理想 - 你需要在每次执行 swift buildswift test 命令时手动将命令行参数传递进去 - 但至少这是可行的。

能够在包配置清单中指定自定义编译设置是 的一部分。我猜我们很快就会看到一个和这一特性有关的 。


  1. 你可以通过添加如下代码段到你的 main.swift 文件然后编译并执行对应包的方式来验证这一点:
#if os(macOS)    print("macOS deployment target:", __MAC_OS_X_VERSION_MIN_REQUIRED)#endif复制代码

如果在 macOS 执行,将会打印:

macOS deployment target: 101000复制代码
  1. 你必须把所有依赖新 API 的代码用 if #available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *) { ... } 或类似的代码块进行包裹。

如有任何知识产权、版权问题或理论错误,还请指正。

https://juejin.im/post/5a3217eb51882534af25f88c
转载请注明原作者及以上信息。

你可能感兴趣的文章
Xcode 创建自定义模板
查看>>
PHP之内置web服务器
查看>>
程序员的小技能,1行代码修改开机密码、1张图片让你电脑死机
查看>>
spring framwork解析
查看>>
吸猫就吸Tomcat之Pipeline-Valve巧妙设计
查看>>
分析JQ作者的类实现过程
查看>>
Uranus Ex通过完善自身,影响更广阔的金融衍生品市场
查看>>
[smali] This Handler class should be static or leaks might occur
查看>>
由canvas实现btn效果有感
查看>>
对于原型链的彻底理解
查看>>
父组件和子组件同是使用 beforeDestroy 钩子 保存同一份数据
查看>>
基于better-scroll实现的类似ios选择器
查看>>
个人经验-项目命名规范
查看>>
[译]理解 Node.js 事件驱动架构
查看>>
01-执行上下文与变量对象
查看>>
React Native在Android当中实践(一)——背景介绍
查看>>
module.exports与exports,export与export defa
查看>>
linux常用shell命令之文件操作命令
查看>>
Botanical Dimensions:借助第九代智能英特尔® 酷睿™ 处理器实现独特沉浸式体验...
查看>>
monkey自动化测试(命令行)
查看>>