iOS 构建流程

编辑页面

了解 iOS 项目如何在 EAS Build 上构建。


For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.

本页面描述了使用 EAS Build 构建 iOS 项目的过程。如果你对构建服务的实现细节感兴趣,建议阅读本文。

构建流程

让我们更详细地看看使用 EAS Build 构建 iOS 项目的步骤。我们会先在你的本地机器上执行一些步骤来准备项目,然后再在远程服务上构建项目。

本地步骤

第一阶段发生在你的电脑上。EAS CLI 负责完成以下步骤:

  1. 如果 eas.json 中的 cli.requireCommit 设置为 true,则检查 git 索引是否干净——这意味着没有任何未提交的更改。如果不干净,EAS CLI 会提供一个选项,让你提交本地更改,或者中止构建过程。

  2. 准备构建所需的凭证。

    • 根据 builds.ios.PROFILE_NAME.credentialsSource 的值,凭证会从本地 credentials.json 文件或 EAS 服务器获取。如果选择了 remote 模式但尚未存在凭证,系统会提示你生成它们。
  3. Bare 项目需要额外一步:检查 Xcode 项目是否已配置为可以在 EAS 服务器上构建(以确保设置了正确的 bundle identifier 和 Apple Team ID)。

  4. 创建包含仓库副本的 tarball。实际行为取决于你正在使用的 VCS 工作流

  5. 将项目 tarball 上传到私有的 Google Cloud Storage(GCS)存储桶,并向 EAS Build 发送构建请求。

远程步骤

在下一阶段,当 EAS Build 接收到你的请求时,会发生以下事情:

  1. 为此次构建创建一个新的 macOS VM。

    • 每次构建都会获得自己全新的 macOS VM,并在那里安装好所有构建工具(Xcode、Fastlane 等)。
  2. 从私有 GCS 存储桶下载项目 tarball 并解压。

  3. 如果设置了 NPM_TOKEN,则创建 .npmrc

  4. 如果 package.json 中定义了 eas-build-pre-install 脚本,则运行它。

  5. 在项目根目录执行 npm install(如果存在 yarn.lock,则执行 yarn install)。

  6. 运行 npx expo-doctor 以诊断项目配置中的潜在问题。

  7. 恢复凭证

    • 创建一个新的 keychain。
    • 将 Distribution Certificate 导入 keychain。
    • 将 Provisioning Profile 写入 ~/Library/MobileDevice/Provisioning Profiles 目录。
    • 验证 Distribution Certificate 和 Provisioning Profile 是否匹配(每个 Provisioning Profile 都分配给特定的 Distribution Certificate,不能用于使用其他证书构建 iOS)。
  8. 对于 managed 项目,额外一步:运行 npx expo prebuild 将项目转换为 bare 项目。此步骤将使用版本化的 Expo CLI。

  9. 恢复之前保存的缓存,该缓存由 构建配置文件 中的 cache.key 值标识。

  10. 在项目中的 ios 目录里运行 pod install

  11. 如果 package.json 中定义了 eas-build-post-install 脚本,则运行它。

  12. 使用 Provisioning Profile 的 ID 更新 Xcode 项目。

  13. 如果 ios 目录中还不存在 Gymfile,则创建它(请查看 默认 Gymfile 部分)。

  14. ios 目录中运行 fastlane gym

  15. 已弃用: 如果 package.json 中定义了 eas-build-pre-upload-artifacts 脚本,则运行它。

  16. 存储 构建配置文件 中定义的文件和目录缓存。默认会缓存 Podfile.lock。后续构建将恢复此缓存。

  17. 将应用归档上传到私有 GCS 存储桶。

    • 归档路径可以在 eas.jsonbuilds.ios.PROFILE_NAME.applicationArchivePath 中配置。默认值为 ios/build/App.ipa。你可以为 applicationArchivePath 指定类似 glob 的模式。我们使用 glob patterns 进行模式匹配。
  18. 如果构建成功:如果 package.json 中定义了 eas-build-on-success 脚本,则运行它。

  19. 如果构建失败:如果 package.json 中定义了 eas-build-on-error 脚本,则运行它。

  20. 如果 package.json 中定义了 eas-build-on-complete 脚本,则运行它。EAS_BUILD_STATUS 环境变量会被设置为 finishederrored

  21. 如果在构建配置文件中指定了 buildArtifactPaths,则将构建产物归档上传到私有 GCS 存储桶。

使用 Fastlane 构建 iOS 项目

我们使用 Fastlane 来构建 iOS 项目。更准确地说,我们使用 fastlane gym 命令(查看 Fastlane 文档以了解更多信息)。这个命令允许你在 Gymfile 中声明构建配置。

EAS Build 可以使用你自己的 Gymfile。你只需要把这个文件放在 ios 目录中即可。

默认 Gymfile

如果 ios/Gymfile 文件不存在,iOS 构建器会创建一个默认文件,内容如下:

ios/Gymfile
suppress_xcode_output(true) clean(true) scheme("app") export_options({ method: "app-store", provisioningProfiles: { "com.expo.eas.builds.test.application" => "dd83ed9c-4f89-462e-b901-60ae7fe6d737" } }) export_xcargs "OTHER_CODE_SIGN_FLAGS=\"--keychain /tmp/path/to/keychain\"" disable_xcpretty(true) output_directory("./build") output_name("App")