编译速度提高60%:强制Xcode在Bitrise上使用缓存!

让我们迈出新一步,使Xcode的构建速度提高60%! 🏎

Xcode在派生数据文件夹(〜/ Library / Developer / Xcode / DerivedData)中存储和使用所有与构建相关的缓存文件和杂项数据,除非您运行导出命令。 但是缓存此路径并不是我们唯一要做的事情,因为Xcode缓存取决于项目结构及其所有属性,例如文件修改时间,内容等。

当您在Bitrise上克隆存储库以进行构建时,所有文件的修改时间都将设置为当前时间(git clone的时间),因此,即使大多数文件都已被修改 ,所有新构建的所有文件都将被视为已更改 。内容在构建之间完全没有变化。

为了避免更改文件修改时间,我们创建了一个名为“ 递归缓存缓存” 的新步骤 。 它有2个输入:

  1. 目录的路径(默认情况下:“ $ BITRISE_SOURCE_DIR”)
  2. 时间(默认为:“ 2017–09–01T15:00:00 + 00:00”)输入字段

此步骤将在给定目录下设置所有文件修改时间,因此在您随后开始的构建中,文件的修改时间将相同。

如果要使用适当的Xcode缓存,则必须设置两个步骤:

  1. 递归缓存缓存步骤-保留两次构建之间的项目文件修改时间。 这应该在您的Xcode单元测试步骤之前进行
  2. Cache:Pull,Cache:Push —缓存派生的数据路径(将以下路径同时放入Cache:Push步骤的缓存路径,忽略路径输入:〜/ Library / Developer / Xcode / DerivedData)。

您如何确认缓存是否按预期工作?

缓存之前,日志如下所示:

如果缓存正在工作,它将是这样的:

 === BUILD TARGET ios-simple-objc OF PROJECT ios-simple-objc WITH CONFIGURATION Debug === Check dependencies === BUILD TARGET ios-simple-objcTests OF PROJECT ios-simple-objc WITH CONFIGURATION Debug === Check dependencies ** BUILD SUCCEEDED ** 

酷吧? 😎

最后,让我们看一下其中一个示例的示例配置:

 --- format_version: 1.1.0 default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git app: envs: - BITRISE_PROJECT_PATH: ios-simple-objc/ios-simple-objc.xcodeproj opts: is_expand: false - BITRISE_SCHEME: ios-simple-objc opts: is_expand: false workflows: primary: steps: - activate-ssh-key@3.1.1: run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' - git-clone: {} - cache-pull@1.0.0: {} - certificate-and-profile-installer: {} - recursive-touch: {} - xcode-test: title: 'Xcode: Unit Test' inputs: - simulator_device: iPhone 5s - output_tool: xcodebuild - cache-push@1.1.4: inputs: - cache_paths: "~/Library/Developer/Xcode/DerivedData" - ignore_check_on_paths: "~/Library/Developer/Xcode/DerivedData" before_run: after_run: trigger_map: - push_branch: "*" workflow: primary 

我们已经运行了一些测试,将cacheedData文件夹缓存起来 ,结果可以节省多达60%的构建时间

注意:存档命令始终会进行干净的重建,因此缓存将无助于加快存档速度。 (这是Xcode中的错误。)

我们还有其他一些缓存解决方案,敬请期待! 😉