注:本文为AI生成,但由于可以解决问题,因此记录为备份

关于在本地使用React Native + Expo写的项目iOS端如何编译的可能有用的AI回答文件.

在 Xcode Cloud 上为 React Native + Expo 项目设置 CI/CD

将 React Native + Expo 项目集成到 Xcode Cloud 的持续集成与持续交付 (CI/CD) 流程中是完全可行的。其核心在于配置自定义构建脚本,以告知 Xcode Cloud 的构建环境如何处理 JavaScript 依赖(如 npm/yarn)和原生 iOS 依赖(CocoaPods)。

通过以下步骤,您可以实现从代码提交到 TestFlight 自动分发的完整自动化流程。


前提条件

在开始之前,请确保您已准备好以下各项:

  1. Apple Developer Program 成员资格:访问 Xcode Cloud 是付费开发者账户的权益。
  2. 项目源码托管:您的项目代码必须托管在 Xcode Cloud 支持的 Git 仓库服务上,如 GitHub, Bitbucket, 或 GitLab。
  3. Xcode:确保您的 Mac 上安装了最新版本的 Xcode。
  4. 原生 iOS 项目:Xcode Cloud 直接构建的是原生 .xcodeproj.xcworkspace 文件。因此,您需要将 Expo 项目“预构建”以生成 ios 目录。

核心理念:使用自定义脚本搭建桥梁

Xcode Cloud 的构建环境是为原生 Apple 开发而设计的,默认情况下,它并不知道如何处理 Node.js、npm/yarn 包或 CocoaPods。为了解决这个问题,我们需要创建一个自定义构建脚本。当 Xcode Cloud 克隆您的代码仓库后,它会自动执行这个脚本来安装所有必要的非原生依赖,为后续的原生 Xcode 构建做好准备。


分步指南

第 1 步:生成原生 iOS 项目

如果您的 Expo 项目仍处于“托管工作流”(Managed Workflow)下,即项目根目录中没有 iosandroid 文件夹,您需要先生成原生项目文件。

在您的项目根目录下打开终端,运行以下命令:

1
npx expo prebuild --platform ios

此命令会根据您的 app.json / app.config.js 配置生成一个 ios 文件夹,其中包含了 Xcode 所需的 .xcworkspace 文件。

重要提示:运行 prebuild 是一项重大更改。请确保在执行前已提交所有代码,并建议在一个新的分支上进行此操作。命令执行后,将新生成的 ios 目录、以及对 .gitignore 等文件的修改一并提交到您的 Git 仓库。

第 2 步:创建自定义构建脚本

这是整个流程中最关键的一步。Xcode Cloud 会在特定时机自动查找并执行名为 ci_scripts 文件夹下的特定脚本。我们将使用 ci_post_clone.sh 脚本,它在 Xcode Cloud 克隆完您的仓库后立即执行。

  1. 创建目录:在您的项目根目录(与 .xcodeproj 文件同级)下创建一个名为 ci_scripts 的文件夹。

  2. 创建脚本文件:在 ci_scripts 文件夹内,创建一个新文件,并将其命名为 ci_post_clone.sh

  3. 编写脚本内容:将以下内容粘贴到 ci_post_clone.sh 文件中。此脚本将安装 Homebrew(如果不存在)、Node.js、Yarn,并安装所有 JavaScript 和 CocoaPods 依赖。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #!/bin/zsh

    # 打印当前所在阶段
    echo "🚀 Stage: Post-clone is running..."

    # 设置 Homebrew 路径并安装(适用于 Apple Silicon 和 Intel Mac 的通用设置)
    if [ -d "/opt/homebrew" ]; then
    # Apple Silicon
    export HOMEBREW_PREFIX="/opt/homebrew"
    else
    # Intel
    export HOMEBREW_PREFIX="/usr/local"
    fi

    export PATH="$HOMEBREW_PREFIX/bin:$PATH"

    # 安装 Node.js 和 Yarn
    echo "🍺 Installing Node.js and Yarn via Homebrew..."
    brew install node yarn

    # 打印 Node 和 Yarn 版本以供调试
    echo "Node version: $(node -v)"
    echo "Yarn version: $(yarn -v)"

    # 安装 JavaScript 依赖
    # CI_PRIMARY_REPOSITORY_PATH 是 Xcode Cloud 指向项目根目录的环境变量
    echo "📦 Installing JavaScript dependencies..."
    cd $CI_PRIMARY_REPOSITORY_PATH
    yarn install

    # 安装 CocoaPods 依赖
    echo "🍫 Installing CocoaPods dependencies..."
    cd $CI_PRIMARY_REPOSITORY_PATH/ios
    pod install

    echo "✅ Stage: Post-clone finished successfully."

  4. 授予执行权限:该脚本文件必须具有可执行权限。在终端中运行以下命令:

    1
    chmod +x ci_scripts/ci_post_clone.sh
  5. 提交脚本:将 ci_scripts 文件夹及其中的 ci_post_clone.sh 文件提交到您的 Git 仓库。

第 3 步:在 Xcode Cloud 中配置工作流

现在,您的项目已经准备就绪。接下来是在 Xcode 中设置 Xcode Cloud。

  1. 打开项目:用 Xcode 打开您项目中的 ios/*.xcworkspace 文件。

  2. 打开 Xcode Cloud 标签:在 Xcode 的左侧导航栏中,选择“Report Navigator”(报告导航器,图标像一个对话气泡),然后选择顶部的 “Cloud” 标签。

  3. 开始配置:Xcode 可能会提示您“Set up Xcode Cloud”。点击并按照向导进行操作。

    • 授权:授权 Xcode 访问您的 Git 仓库。
    • 创建工作流 (Workflow):Xcode 会分析您的项目并建议一个默认工作流。
  4. 编辑工作流配置

    • 常规 (General):为您的工作流命名,并选择产品(您的 App)。
    • 环境 (Environment):选择最新的稳定版 Xcode 和 macOS。可以根据需要设置环境变量。
    • 开始条件 (Start Conditions):配置触发构建的条件。例如,您可以设置为当代码推送到 maindevelop 分支时自动开始构建。
    • 操作 (Actions)
      • Archive:这是核心操作。确保选择正确的平台(iOS)和 Scheme。Xcode Cloud 会自动发现并使用您的 ci_post_clone.sh 脚本,无需在此处额外配置。
    • 部署后操作 (Post-Actions)
      • TestFlight (Internal/External Testing):配置此项可实现构建成功后自动将 App 上传到 App Store Connect 并分发给内部或外部测试人员。
  5. 保存并开始第一次构建:保存您的工作流配置。您可以手动触发第一次构建,或通过向您配置的启动分支(如 main)推送一次提交来触发。


常见问题与最佳实践

  • 构建缓慢:由于 Xcode Cloud 的构建环境是临时的,每次构建都需要重新通过 Homebrew 安装 Node.js 和其他依赖,这会比 eas build 或本地构建慢。这是使用 Xcode Cloud 处理 React Native 项目的正常现象。
  • 管理密钥/环境变量:如果您的项目需要 API 密钥或其他敏感信息,请不要硬编码在代码中。应在 Xcode Cloud 工作流配置的“Environment”部分,将它们添加为秘密 (Secret) 环境变量。选中 “Secret” 复选框可防止其值在构建日志中暴露。
  • 调试构建失败:如果构建失败,请仔细查看 Xcode Cloud 提供的构建日志。日志会详细记录 ci_post_clone.sh 脚本的每一步输出,通常可以从中找到错误原因,例如依赖安装失败或脚本语法错误。
  • 选择 Xcode Cloud 还是 EAS Build?
    • EAS Build:由 Expo 团队提供,是为 React Native 和 Expo 项目量身定制的 CI/CD 服务。它通常开箱即用,配置更简单,构建速度更快。
    • Xcode Cloud:是苹果官方的 CI/CD 方案。如果您的团队已经深度集成在苹果生态中,或者您的项目除了 React Native App 外还包含其他原生目标(如 watchOS App、小组件等),或者公司政策要求使用第一方工具,那么 Xcode Cloud 是一个绝佳的选择。

通过以上配置,您的 React Native + Expo 项目就可以享受苹果原生 CI/CD 带来的便利,实现高效、可靠的自动化构建与分发。