注:本文译自 NSHipster

控制了一门语言的构建系统(build system),就控制了这门语言的命运,以及它的生态和社区。

Objective-C 用很短的时间,取得了非常大的变化。在短短几年间,这门语言从 NeXT 的“废墟”中走出,成为颇具影响力的一门语言。开源社区对于 Objective-C 有着巨大的贡献,其中一个很重要的方面是:开发工具。

例如 CocoaPods,它充分证明了科技和社区结合的威力。两年间,有超过 2700 个开源的库或框架被添加进去,你只需要简单的命令行 - pod install,就可以轻松管理第三方库。

开源社区对于 iOS 和 Mac OS X 开发的各个方面都有着巨大贡献,第三方库管理只是其中一个,其他方面还包括自动配置和分发报告BUG文档检索等。

但是本周,我们聚焦于这样一个工具:它重新定义了构建过程,是新一代开发集成的基础——xctool。

xctoolFred Potter 的开源项目,来自于他在 Facebook 工作中创建的自动构建系统。xctool 用于替换 Xcode.app 中的 xcodebuild

在 Xcode 中点击“Build & Run”,所有的 project、build target 和 scheme settings 都被传到 xcodebuild,xcodebuild 调用构建的命令行,然后执行 .ipa 文件运行在真机或模拟器上。

这个过程我们只能祈祷它顺利了,因为 Xcode 将自己的构建系统封闭起来,我们从外部很难访问和控制。当我们试图通过 Terminal.app 和 xcodebuild 交互的时候,会发现真的很难用。

与其使用上个时代的工具,狂打断点去遍历所有错误,不如让 xctool 来告诉你什么是现代的解决方案。

美学和风格

xctool 给人的第一印象是它那漂亮、彩色的输出样式。

我们自己作为苹果硬件和软件的用户,对设计绝对不会轻视。xctool 也是。
它把构建过程的每一步都组织的很整洁,通过 ANSI 标准色 和 Unicode 符号输出易懂、易读的报告。

但是 xctool 的美丽不仅是外在,build 的过程中可以生成用其他工具可读的报告:

  xctool -reporter plain:output.txt build

报告类型:

  • pretty:(默认)输出样式使用 ANSI 标准色和 Unicode 符号
  • plain:类似 pretty,但没有 ANSI 标准色和 Unicode 符号
  • phabricator:将构建/测试的结果输出为 JSON 数组,可导入到 Phabricator 这个 code-review 工具
  • junit:生成兼容 JUnit/xUnit 的 XML 格式的测试结果
  • json-stream:输出构建/测试的事件流 ( JSON 字典格式),一行一个(如图)
  • json-compilation-database:输出 JSON Compilation Database,可用于基于 Clang Tooling 的工具,如 OCLint

集成构建系统

相对于 xcodebuild,xctool 另一个重大改进是可以和 Xcode.app 一样运行测试(xcodebuild 并不能分辨哪些 target 是 test target,从而单独运行它们)。

单单这个原因,对于 Objective-C 社区的持续集成测试这个领域,xctool 就有非常大的意义。

Travis CI

Travis CI 为开源项目提供免费的持续集成服务(商业项目收费),支持 Objective-C。它可以在你每次提交到 GitHub 时自动运行你的测试代码,如果最新的提交导致构建失败它会通知你。

在你的 Objective-C 项目中添加 Travis CI,你需要创建账号绑定 GitHub,然后在你的 repo 中添加 .travis.yml 文件:

.travis.yml

language: objective-c
before_install:
    - brew update
    - brew install xctool
script: xctool -workspace MyApp.xcworkspace -scheme MyApp test

OCLint

OCLint 是一个静态代码分析器,可以检测 Objective-C 代码(同时支持 C 和 C++),发现常见的问题:例如 if/else/try/catch/finally 声明出错、未被使用的本地实例和参数、过度复杂(有效代码行数 和 循环复杂度太高)、冗余代码、代码异味、以及其他不好的代码。

还记得 xctool 的 json-compilation-database 格式吧,这种格式可以被 OCLint 直接读取,进而进行神奇的静态分析。

在我写这篇文章的时候,离构建系统集成被广泛接受还有很长的路,但我的希望是,既然已经开始,
大家就应该齐心协力,让这个有前途的工具变得更加的强大。

这就像一座城市,随着人口的增长,基础设施就需要改变。通过各种各样的方式,通过本地政府、新兴组织,或者其他。总之,环境需要改变,以适应人口的增长。

Objective-C 已经并且还将随着 iOS 设备的流行而快速进化。为更多新进开发者提供必要的基础设施是社区的责任,当然这离不开与苹果的协作(有时是反对或抗议)。我们在这方面做得如何,决定了我们是否真正理解并传达了作为专业开发者应当扮演的角色,以及应当承担的责任。

我们是该成为平庸的业余者,还是该成为改善技术的关键角色?

xctool,和社区的其他工具一样,为这门语言的未来和生态,提供了希望和灵感。让我们继续创造这样强大的工具,创造我们为之自豪的开发体验。