This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

自定义构建配置 schema

编辑页面

EAS Build 自定义构建的配置选项参考。


为 EAS Build 创建自定义构建有助于为你的项目定制构建流程。

用于自定义构建的 YAML 语法

自定义构建配置文件存储在 .eas/build 目录路径下。它们使用 YAML 语法,并且必须具有 .yml 或 .yaml 文件扩展名。如果你是 YAML 新手,或者想进一步了解其语法,请参阅 在 Y 分钟内学习 YAML。

build

用于描述一个自定义构建配置。创建自定义构建所需的所有配置选项都在其下指定。

name

你的自定义构建的名称,用于在构建日志中标识它。EAS Build 使用此属性在仪表板中显示你的构建名称。

例如,构建名称为 Run tests:

build: name: Run tests steps: - eas/checkout - run: name: 安装依赖 command: npm install

steps

步骤用于描述一系列操作,可以是命令或函数调用的形式。这些操作会在自定义构建运行于 EAS Build 时执行。你可以在构建配置中定义单个或多个步骤。不过,每个构建必须至少定义一个步骤。

每个步骤都使用以下属性进行配置:

steps[].run

run 键用于触发一组指令。例如,run 键可用于使用 npm install 命令安装依赖:

build: name: 安装 npm 依赖 steps: - eas/checkout - run: name: 安装依赖 command: npm install

你也可以使用 steps[].run 来执行单行或多行 shell 命令:

build: name: 运行内联 shell 命令 steps: - run: echo "Hello world" - run: | echo "Multiline" echo "bash commands"

使用单个步骤

例如,具有以下 steps 的构建配置将打印 "Hello world":

build: name: 问候 steps: - run: echo "Hello world"

使用多个步骤

当定义多个 steps 时,它们会按顺序执行。例如,具有以下 steps 的构建配置将首先检出项目,安装 npm 依赖,然后运行一个命令来执行测试:

build: name: 运行测试 steps: - eas/checkout - run: name: 安装依赖 command: npm install - run: name: 运行测试 command: | echo "Running tests..." npm test

与其他步骤共享环境变量

在某个步骤的 command 中导出(使用 export)的环境变量,不会自动对其他步骤可见。要与其他步骤共享环境变量,请使用 set-env 可执行文件。

set-env 需要接收两个参数:环境变量名和值。例如,set-env NPM_TOKEN "abcdef" 会将值为 abcdef 的 $NPM_TOKEN 变量暴露给其他步骤。

build: name: 共享环境变量示例 steps: - run: name: 设置环境变量 command: | set -x # 设置变量 ENV_TEST_LOCAL="仅存在于当前 shell 上下文中" # 设置并导出变量 export ENV_TEST_LOCAL_EXPORT="存在于当前步骤中" # 设置共享变量 set-env ENV_TEST_SET_ENV "存在于后续步骤中" # 将打印 "ENV_TEST_LOCAL: 仅存在于当前 shell 上下文中" # 因为当前 shell 可以访问这个本地变量。 echo "ENV_TEST_LOCAL: $ENV_TEST_LOCAL" # 将打印 "ENV_TEST_LOCAL_EXPORT: 存在于当前步骤中" # 因为 export 也会设置本地变量值。 echo "ENV_TEST_LOCAL_EXPORT: $ENV_TEST_LOCAL_EXPORT" # 将打印 "ENV_TEST_SET_ENV: " # 因为 set-env 不会设置或导出变量。 echo "ENV_TEST_SET_ENV: $ENV_TEST_SET_ENV" # 只会打印 LOCALLY_EXPORTED_ENV, # 因为它是唯一被导出的变量。 env | grep ENV_TEST_ - run: name: 在下一步中检查变量值 command: | set -x # 将打印 "ENV_TEST_LOCAL: ",因为 ENV_TEST_LOCAL # 只是前一步中的本地变量。 echo "ENV_TEST_LOCAL: $ENV_TEST_LOCAL" # 将打印 "ENV_TEST_LOCAL_EXPORT: " # 因为 export 不会将变量共享给其他步骤。 echo "ENV_TEST_LOCAL_EXPORT: $ENV_TEST_LOCAL_EXPORT" # 将打印 "ENV_TEST_SET_ENV: 存在于后续步骤中" # 因为 set-env 已将变量“导出”给其他步骤。 echo "ENV_TEST_SET_ENV: $ENV_TEST_SET_ENV" # 只会打印 ENV_TEST_SET_ENV, # 因为 set-env 已将它“导出”给其他步骤。 env | grep ENV_TEST_

steps[].run.name

用于在构建日志中显示该步骤名称的名称。

steps[].run.command

command 定义了步骤执行时运行的自定义 shell 命令。每个步骤都必须定义一个命令。它可以是多行 shell 命令:

build: name: 运行测试 steps: - eas/checkout - run: name: 运行测试 command: | echo "Running tests..." npm test

steps[].run.working_directory

working_directory 用于定义项目根目录下的一个现有目录。在步骤中定义了现有路径后,使用它会改变该步骤的当前目录。例如,创建一个步骤来列出 assets 目录中的所有资源文件,该目录是你的 Expo 项目中的一个目录。working_directory 被设置为 assets:

build: name: 演示 steps: - eas/checkout - run: name: 列出资源文件 working_directory: assets command: ls -la

steps[].run.shell

用于定义步骤的默认可执行 shell。例如,该步骤的 shell 被设置为 /bin/sh:

build: name: 演示 steps: - run: shell: /bin/sh command: | echo "Steps can use another shell" ps -p $$

steps[].run.inputs

输入值会提供给步骤。例如,你可以使用 input 来提供一个值:

build: name: 演示 steps: - run: name: 打招呼 inputs: name: Expo command: echo "Hi, ${ inputs.name }!"

steps[].run.outputs

步骤执行期间会产生一个输出值。例如,一个步骤的输出值为 Hello world:

build: name: 演示 steps: - run: name: 生成输出 outputs: [value] command: | echo "Producing output for another step" set-output value "来自另一个步骤的输出..."

steps[].run.outputs.required

输出值可以使用布尔值来指示该输出值是否为必需。例如,一个函数没有必需的输出值:

build: name: 演示 steps: - run: name: 生成另一个输出 id: id456 outputs: - required_param - name: optional_param required: false command: | echo "Producing more output" set-output required_param "abc 123 456"

steps[].run.id

为步骤定义 id 允许:

  • 多次调用产生一个或多个输出的同一个函数
  • 将一个步骤的输出用于另一个步骤

多次调用同一个函数

例如,以下函数会生成一个随机数:

functions: random: name: 生成随机数 outputs: [value] command: set-output value `random_number`

在构建配置中,我们来使用 random 函数生成两个随机数并打印出来:

build: name: 函数演示 steps: - random: id: random_1 - random: id: random_2 - run: name: 打印随机数 inputs: random_1: ${ steps.random_1.value } random_2: ${ steps.random_2.value } command: | echo "${ inputs.random_1 }" echo "${ inputs.random_2 }"

将一个步骤的输出用于另一个步骤

例如,以下构建配置演示了如何将一个步骤的输出用于另一个步骤:

build: name: 输出演示 steps: - run: name: 生成输出 id: id123 # <---- !!! outputs: [foo] command: | echo "Producing output for another step" set-output foo bar - run: name: 使用另一个步骤的输出 inputs: foo: ${ steps.id123.foo } command: | echo "foo = \"${ inputs.foo }\""

functions

用于描述一个可在构建配置中使用的可复用函数。创建函数所需的所有配置选项都通过以下属性指定:

functions.[function_name]

[function_name] 是你定义的函数名称,用于在 build.steps 中标识它。例如,你可以定义一个名为 greetings 的函数:

functions: greetings: name: 你好!

functions.[function_name].name

用于构建日志中显示函数名称的名称。例如,一个显示名称为 你好! 的函数:

functions: greetings: name: 你好!

functions.[function_name].inputs

输入值会提供给一个函数。

inputs[].name

输入值的名称。它用作标识符,以访问输入值,例如在 bash 命令插值中。

输入类型必填描述
flow_pathstring要运行的 Maestro 流程的路径(或多个路径,每个路径占一行)
app_pathstring要测试的模拟器应用路径(或正则表达式模式)。如果未提供,Android 默认为 android/app/build/outputs/**/*.apk,iOS 默认为 ios/build/Build/Products/*simulator/*.app

对于基于 Git 的项目源,默认情况下,该步骤会使用构建记录的提交。使用 ref 可以检出其他分支、标签或提交:

example.yml
build: name: 检出特定 ref steps: - eas/checkout: inputs: ref: feature/add-icon - eas/build

ref 接受:

  • 分支,可以是 feature/add-icon 这样的裸名称,也可以是 refs/heads/feature/add-icon 这样的限定 ref。最终仓库会位于该分支上
  • 标签,例如 refs/tags/v1.2.3 这样的限定 ref。最终仓库会处于分离的 HEAD 状态
  • 完整的提交 SHA。最终仓库会处于分离的 HEAD 状态

只有当项目源来自 Git 仓库时,ref 输入才有效,例如通过 GitHub 集成触发的构建。本地构建和上传的项目 tarball 不支持该输入。请将此步骤放在 eas/build 之前,因为后者会在内部检出项目

属性类型必填描述
refstring要检出的 Git 分支、标签或完整提交 SHA。默认为触发构建或工作流任务的 ref。
eas/checkout 源代码

在 GitHub 上查看 eas/checkout 函数的源代码。

eas/use_npm_token

配置 Node 包管理器(bun、npm、pnpm 或 Yarn),以便使用发布到 npm 或私有注册表中的私有包

在项目的 secrets 中设置 NPM_TOKEN,此函数会通过创建包含该令牌的 .npmrc 来配置构建环境

example.yml
build: name: 安装私有 npm 模块 steps: - eas/checkout - eas/use_npm_token - run: name: 安装依赖 run: npm install # <---- 现在可以安装私有包了
eas/use_npm_token 源代码

在 GitHub 上查看 eas/use_npm_token 函数的源代码。

eas/install_node_modules

使用根据项目检测到的包管理器(bun、npm、pnpm 或 Yarn)安装 node_modules。支持 monorepo

example.yml
build: name: 安装 node 模块 steps: - eas/checkout - eas/install_node_modules
eas/install_node_modules 源代码

在 GitHub 上查看 eas/install_node_modules 函数的源代码。

eas/restore_build_cache

从指定的 key 恢复之前保存的构建缓存。这对于通过复用已缓存的产物(如编译后的依赖、构建工具或其他中间构建输出)来加快构建速度非常有用。

example.yml
build: name: 使用缓存构建 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/restore_build_cache: inputs: key: cache-${{ hashFiles('package-lock.json') }} restore_keys: cache path: /path/to/cache
example.yml
build: name: 使用缓存构建 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/restore_build_cache: inputs: key: cache-${{ hashFiles('package-lock.json') }} path: /path/to/cache
属性类型必填描述
name-构建日志中显示的可复用函数步骤名称。默认为 Restore build cache。
inputs.keystring要恢复的缓存键。你可以使用 ${{ hashFiles('package-lock.json') }} 这样的表达式,根据文件哈希创建动态键。
inputs.restore_keysstring如果未找到完全匹配的键,则使用的备用键或前缀。如果提供了此值,缓存系统将查找以该前缀开头的任何缓存条目。
inputs.pathstring恢复缓存的路径。此路径应与保存缓存时使用的路径一致。
eas/restore_build_cache 源代码

在 GitHub 上查看 eas/restore_build_cache 函数的源代码。

eas/save_build_cache

将构建缓存保存到指定的键。这使你能够持久保存构建产物、编译后的依赖项或其他中间输出,以便在后续构建中复用,从而加快构建流程。

example.yml
build: name: 使用缓存构建 steps: - eas/checkout - eas/restore_build_cache: inputs: key: cache-${{ hashFiles('package-lock.json') }} path: /path/to/cache - eas/install_node_modules - eas/prebuild - eas/run_gradle - eas/save_build_cache: inputs: key: cache-${{ hashFiles('package-lock.json') }} path: /path/to/cache
属性类型必填描述
name-构建日志中显示的可复用函数步骤名称。默认为 Save build cache。
inputs.keystring保存缓存时使用的缓存键。你可以使用 ${{ hashFiles('package-lock.json') }} 这样的表达式,根据文件哈希创建动态键。此键应与恢复缓存时使用的键一致。
inputs.pathstring要缓存的目录或文件的路径。此路径应与恢复缓存时使用的路径一致。
eas/save_build_cache 源代码

在 GitHub 上查看 eas/save_build_cache 函数的源代码。

eas/resolve_build_config

解析并打印构建配置。如果构建由 GitHub 集成触发,它会更新当前的 job 和 metadata 上下文值。应在安装依赖项之后调用,因为配置可能会受到配置插件的影响。

该函数会被 eas/build 函数组自动执行。

eas/resolve_build_config 源代码

在 GitHub 上查看 eas/resolve_build_config 函数的源代码。

eas/get_credentials_for_build_triggered_by_github_integration

eas/resolve_apple_team_id_from_credentials

根据在 inputs.credentials 中提供的构建凭据解析 Apple team ID 值。解析得到的 Apple team ID 会存储在 outputs.apple_team_id 输出值中。

example.yml
build: name: 运行 prebuild 脚本 steps: - eas/checkout - eas/install_node_modules - eas/resolve_apple_team_id_from_credentials: id: resolve_apple_team_id_from_credentials - eas/prebuild: inputs: apple_team_id: ${ steps.resolve_apple_team_id_from_credentials.apple_team_id }
属性类型必填描述
namestring构建日志中显示的可复用函数步骤名称。默认为 Resolve Apple team ID from credentials。
inputs.credentialsjsoniOS 构建的应用凭据。默认为 ${ eas.job.secrets.buildCredentials }。需符合 iOS 的 ${ eas.job.secrets.buildCredentials } 架构。
eas/resolve_apple_team_id_from_credentials 源代码

在 GitHub 上查看 eas/resolve_apple_team_id_from_credentials 函数的源代码。

eas/prebuild

使用根据项目检测到的包管理器(bun、npm、pnpm 或 Yarn),运行最适合构建类型和构建环境的 expo prebuild 命令。

example.yml
build: name: 运行 prebuild 脚本 steps: - eas/checkout - eas/install_node_modules - eas/resolve_apple_team_id_from_credentials: id: resolve_apple_team_id_from_credentials - eas/prebuild: inputs: clean: false apple_team_id: ${ steps.resolve_apple_team_id_from_credentials.apple_team_id }
example.yml
build: name: 运行 prebuild 脚本 steps: - eas/checkout - eas/install_node_modules - eas/prebuild
属性类型描述
cleanboolean可选属性,用于定义函数运行命令时是否应使用 --clean 标志。默认为 false。
apple_team_idstring可选属性,用于定义执行预构建时应使用的 Apple 团队 ID。使用凭据进行 iOS 构建时必须指定此属性。
eas/prebuild 源代码

在 GitHub 上查看 eas/prebuild 函数的源代码。

eas/configure_eas_update

为构建配置运行时版本和发布通道。

example.yml
build: name: 配置 EAS Update steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update
example.yml
build: name: 配置 EAS Update steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update: inputs: runtime_version: 1.0.0 channel: mychannel
属性类型必填描述
name-构建日志中显示的可复用函数步骤名称。默认为 Configure EAS Update。
inputs.runtime_versionstring应为构建配置的运行时版本。默认为 ${ eas.job.version.runtimeVersion } 或原生定义的运行时版本。
inputs.channelstring应为构建配置的通道。默认为 ${ eas.job.updates.channel }。
eas/configure_eas_update 源代码

在 GitHub 上查看 eas/configure_eas_update 函数的源代码。

eas/inject_android_credentials

在构建机上使用凭据配置 Android keystore,并使用这些凭据将应用签名配置注入 Gradle 配置中。

example.yml
build: name: Android 凭据 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/inject_android_credentials
属性类型必填描述
name-构建日志中显示的可复用函数步骤名称。默认为 Inject Android credentials。
inputs.credentialsjsonAndroid 构建的应用凭据。默认为 ${ eas.job.secrets.buildCredentials }。需符合 Android 的 ${ eas.job.secrets.buildCredentials } 架构。
eas/inject_android_credentials 源代码

在 GitHub 上查看 eas/inject_android_credentials 函数的源代码。

eas/configure_ios_credentials

在构建机上配置 iOS 凭据。通过将 provisioning profiles 分配给各个 targets 来修改 Xcode 项目的配置。

example.yml
build: name: iOS 凭据 steps: - eas/checkout - eas/install_node_modules - eas/resolve_apple_team_id_from_credentials: id: resolve_apple_team_id_from_credentials - eas/prebuild: inputs: clean: false apple_team_id: ${ steps.resolve_apple_team_id_from_credentials.apple_team_id } - eas/configure_ios_credentials
属性类型必填描述
name-构建日志中显示的可复用函数步骤名称。默认为 Configure iOS credentials。
inputs.build_configurationstringXcode 项目的 Build Configuration。默认为 ${ eas.job.buildConfiguration };如果未指定,则开发客户端使用 Debug,其他构建使用 Release。
inputs.credentialsjsoniOS 构建的应用凭据。默认为 ${ eas.job.secrets.buildCredentials }。需符合 iOS 的 ${ eas.job.secrets.buildCredentials } 架构。
eas/configure_ios_credentials 源代码

在 GitHub 上查看 eas/configure_ios_credentials 函数的源代码。

eas/configure_android_version

配置 Android 应用的版本。在使用远程应用版本管理时,可用它来设置版本。

不使用此函数也没关系;如果未使用,则会采用 prebuild 阶段生成的原生代码中的版本。

example.yml
build: name: 配置 Android 版本 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update - eas/inject_android_credentials - eas/configure_android_version
example.yml
build: name: 配置 Android 版本 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update - eas/inject_android_credentials - eas/configure_android_version: inputs: version_code: '123' version_name: '1.0.0'
属性类型必填描述
name-构建日志中显示的可复用函数步骤名称。默认为 Configure Android version。
inputs.version_codestringAndroid 构建的 versionCode。默认为 ${ eas.job.version.versionCode }。
inputs.version_namestringAndroid 构建的 versionName。默认为 ${ eas.job.version.versionName }。
eas/configure_android_version 源代码

在 GitHub 上查看 eas/configure_android_version 函数的源代码。

eas/configure_ios_version

配置 iOS 应用的版本。在使用远程应用版本管理时,可用它来设置版本。

不使用此函数也没关系;如果未使用,则会采用 prebuild 阶段生成的原生代码中的版本。

example.yml
build: name: 配置 iOS 版本 steps: - eas/checkout - eas/install_node_modules - eas/resolve_apple_team_id_from_credentials: id: resolve_apple_team_id_from_credentials - eas/prebuild: inputs: clean: false apple_team_id: ${ steps.resolve_apple_team_id_from_credentials.apple_team_id } - eas/configure_eas_update - eas/configure_ios_credentials - eas/configure_ios_version
example.yml
build: name: 配置 iOS 版本 steps: - eas/checkout - eas/install_node_modules - eas/resolve_apple_team_id_from_credentials: id: resolve_apple_team_id_from_credentials - eas/prebuild: inputs: clean: false apple_team_id: ${ steps.resolve_apple_team_id_from_credentials.apple_team_id } - eas/configure_eas_update - eas/configure_ios_credentials - eas/configure_ios_version: inputs: build_number: '123' app_version: '1.0.0'
属性类型必填描述
name-构建日志中显示的可复用函数步骤名称。默认为 Configure iOS version。
inputs.build_numberstringiOS 构建的构建号(CFBundleVersion)。默认为 ${ eas.job.version.buildNumber }。
inputs.app_versionstringiOS 构建的应用版本(CFBundleShortVersionString)。默认为 ${ eas.job.version.appVersion }。
inputs.build_configurationstringXcode 项目的 Build Configuration。默认为 ${ eas.job.buildConfiguration };如果未指定,则开发客户端使用 Debug,其他构建使用 Release。
inputs.credentialsjsoniOS 构建的应用凭据。默认为 ${ eas.job.secrets.buildCredentials }。需符合 iOS 的 ${ eas.job.secrets.buildCredentials } 架构。
eas/configure_ios_version 源代码

在 GitHub 上查看 eas/configure_ios_version 函数的源代码。

eas/run_gradle

运行 Gradle 命令以构建 Android 应用。

example.yml
build: name: 构建 Android 应用 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update - eas/inject_android_credentials - eas/run_gradle
example.yml
build: name: 构建 Android 应用 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update - eas/inject_android_credentials - eas/run_gradle: inputs: command: :app:bundleRelease
属性类型必填描述
name-构建日志中显示的可复用函数步骤名称。默认为 Run gradle。
inputs.commandstring用于构建 Android 应用的 Gradle 命令。如果未指定,则根据构建配置和 ${ eas.job } 对象的内容确定。
eas/run_gradle 源代码

在 GitHub 上查看 eas/run_gradle 函数的源代码。

eas/generate_gymfile_from_template

从模板生成一个用于通过 Fastlane 构建 iOS 应用的 Gymfile。

使用凭据时的默认模板:

Gymfile
suppress_xcode_output(true) clean(<%- CLEAN %>) scheme("<%- SCHEME %>") <% if (BUILD_CONFIGURATION) { %> configuration("<%- BUILD_CONFIGURATION %>") <% } %> export_options({ method: "<%- EXPORT_METHOD %>", provisioningProfiles: {<% _.forEach(PROFILES, function(profile) { %> "<%- profile.BUNDLE_ID %>" => "<%- profile.UUID %>",<% }); %> }<% if (ICLOUD_CONTAINER_ENVIRONMENT) { %>, iCloudContainerEnvironment: "<%- ICLOUD_CONTAINER_ENVIRONMENT %>" <% } %> }) export_xcargs "OTHER_CODE_SIGN_FLAGS=\\"--keychain <%- KEYCHAIN_PATH %>\\"" disable_xcpretty(true) buildlog_path("<%- LOGS_DIRECTORY %>") output_directory("<%- OUTPUT_DIRECTORY %>")

未传入凭据时使用的默认模板(模拟器构建):

Gymfile
suppress_xcode_output(true) clean(<%- CLEAN %>) scheme("<%- SCHEME %>") <% if (BUILD_CONFIGURATION) { %> configuration("<%- BUILD_CONFIGURATION %>") <% } %> derived_data_path("<%- DERIVED_DATA_PATH %>") skip_package_ipa(true) skip_archive(true) destination("<%- SCHEME_SIMULATOR_DESTINATION %>") disable_xcpretty(true) buildlog_path("<%- LOGS_DIRECTORY %>")

CLEAN、SCHEME、BUILD_CONFIGURATION、EXPORT_METHOD、PROFILES、ICLOUD_CONTAINER_ENVIRONMENT、KEYCHAIN_PATH、LOGS_DIRECTORY、OUTPUT_DIRECTORY、DERIVED_DATA_PATH 和 SCHEME_SIMULATOR_DESTINATION 的值会根据输入以及 EAS Build 的默认内部配置提供给模板。

example.yml
build: name: 生成 Gymfile 模板 steps: - eas/checkout - eas/install_node_modules - eas/resolve_apple_team_id_from_credentials: id: resolve_apple_team_id_from_credentials - eas/prebuild: inputs: clean: false apple_team_id: ${ steps.resolve_apple_team_id_from_credentials.apple_team_id } - eas/configure_eas_update - eas/configure_ios_credentials - eas/generate_gymfile_from_template: inputs: credentials: ${ eas.job.secrets.buildCredentials }
example.yml
build: name: 生成 Gymfile 模板 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/generate_gymfile_from_template

不过,你也可以通过在 inputs.template 中指定自定义模板,并在 inputs.extra 对象中提供这些自定义属性的值,在模板中使用其他自定义属性。

example.yml
build: name: 生成 Gymfile 模板 steps: - eas/checkout - eas/install_node_modules - eas/resolve_apple_team_id_from_credentials: id: resolve_apple_team_id_from_credentials - eas/prebuild: inputs: clean: false apple_team_id: ${ steps.resolve_apple_team_id_from_credentials.apple_team_id } - eas/configure_eas_update - eas/configure_ios_credentials - eas/generate_gymfile_from_template: inputs: credentials: ${ eas.job.secrets.buildCredentials } extra: MY_VALUE: my value template: | suppress_xcode_output(true) clean(<%- CLEAN %>) scheme("<%- SCHEME %>") <% if (BUILD_CONFIGURATION) { %> configuration("<%- BUILD_CONFIGURATION %>") <% } %> export_options({ method: "<%- EXPORT_METHOD %>", provisioningProfiles: {<% _.forEach(PROFILES, function(profile) { %> "<%- profile.BUNDLE_ID %>" => "<%- profile.UUID %>",<% }); %> }<% if (ICLOUD_CONTAINER_ENVIRONMENT) { %>, iCloudContainerEnvironment: "<%- ICLOUD_CONTAINER_ENVIRONMENT %>" <% } %> }) export_xcargs "OTHER_CODE_SIGN_FLAGS=\"--keychain <%- KEYCHAIN_PATH %>\"" disable_xcpretty(true) buildlog_path("<%- LOGS_DIRECTORY %>") output_directory("<%- OUTPUT_DIRECTORY %>") sth_else("<%- MY_VALUE %>")
PropertyTypeRequiredDescription
name-可复用函数中步骤的名称,会显示在构建日志中。默认为 Generate Gymfile from template。
inputs.templatestring要使用的 Gymfile 模板。如果未指定,将根据是否指定 inputs.credentials 值,使用两个默认模板之一。
inputs.credentialsjsoniOS 构建的应用凭据。如果指定,将向模板提供 KEYCHAIN_PATH、EXPORT_METHOD 和 PROFILES 值。
inputs.build_configurationstringXcode 项目的 Build Configuration。默认为 ${ eas.job.buildConfiguration };如果未指定,则开发客户端构建使用 Debug,其他构建使用 Release。对应于 BUILD_CONFIGURATION 模板值。
inputs.schemestring构建时要使用的 Xcode 项目 scheme。默认为 ${ eas.job.scheme };如果未指定,则解析为 Xcode 项目中找到的第一个 scheme。对应于 SCHEME 模板值。
inputs.cleanboolean是否应在构建前清理 Xcode 项目。默认为 true。对应于 CLEAN 模板变量。
inputs.extrajson要提供给模板的额外值。
eas/generate_gymfile_from_template 源代码

在 GitHub 上查看 eas/generate_gymfile_from_template 函数的源代码。

eas/run_fastlane

在 ios 项目目录中,针对位于该目录下的 Gymfile 运行 fastlane gym 命令,以构建 iOS 应用。

example.yml
build: name: 构建 iOS 应用 steps: - eas/checkout - eas/install_node_modules - eas/resolve_apple_team_id_from_credentials: id: resolve_apple_team_id_from_credentials - eas/prebuild: inputs: clean: false apple_team_id: ${ steps.resolve_apple_team_id_from_credentials.apple_team_id } - eas/configure_eas_update - eas/configure_ios_credentials - eas/generate_gymfile_from_template: inputs: credentials: ${ eas.job.secrets.buildCredentials } - eas/run_fastlane
example.yml
build: name: 构建 iOS 应用 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update - eas/generate_gymfile_from_template - eas/run_fastlane
eas/run_fastlane 源代码

在 GitHub 上查看 eas/run_fastlane 函数的源代码。

eas/find_and_upload_build_artifacts

自动从默认位置以及使用 buildArtifactPaths 配置中查找并上传应用归档、其他构建工件和 Xcode 日志。将找到的工件上传到 EAS 服务器。

example.yml
build: name: 构建 iOS 应用 steps: - eas/checkout - eas/install_node_modules - eas/resolve_apple_team_id_from_credentials: id: resolve_apple_team_id_from_credentials - eas/prebuild: inputs: clean: false apple_team_id: ${ steps.resolve_apple_team_id_from_credentials.apple_team_id } - eas/configure_eas_update - eas/configure_ios_credentials - eas/generate_gymfile_from_template: inputs: credentials: ${ eas.job.secrets.buildCredentials } - eas/run_fastlane - eas/find_and_upload_build_artifacts
example.yml
build: name: 构建 iOS 应用 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update - eas/generate_gymfile_from_template - eas/run_fastlane - eas/find_and_upload_build_artifacts
example.yml
build: name: 构建 Android 应用 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update - eas/inject_android_credentials - eas/run_gradle - eas/find_and_upload_build_artifacts
eas/find_and_upload_build_artifacts 源代码

在 GitHub 上查看 eas/find_and_upload_build_artifacts 函数的源代码。

eas/upload_artifact

将作业工作区中的文件作为工件附加到运行中。上传的工件会显示在运行的 Artifacts 部分,并可在后续作业中通过 eas/download_artifact 获取。

upload.yml
build: name: 上传工件 steps: - eas/checkout # - ... - eas/upload_artifact: name: 上传应用归档 inputs: path: fixtures/app-debug.apk - eas/upload_artifact: name: 上传工件 inputs: type: build-artifact path: | assets/*.jpg assets/*.png
属性类型必填描述
pathstring要上传的路径或以换行符分隔的路径列表。支持 * 和其他 glob 模式。
typestring构件类型。在自定义作业中使用 other(通用构件)。当作业没有构建平台时,默认为 other;在构建作业中默认为 application-archive。构建范围的值 application-archive 和 build-artifact 仅适用于构建作业。
namestring构件名称,用于从 eas/download_artifact 引用该构件。
metadatajson要附加到通用(other)构件的任意元数据。
ignore_errorboolean为 true 时,上传失败会记录日志,但不会导致步骤失败。默认为 false。
输出
属性类型描述
artifact_idstring已上传构件的 ID。可传递给 eas/download_artifact。
eas/upload_artifact 源代码

在 GitHub 上查看 eas/upload_artifact 函数的源代码。

eas/install_maestro

确保已安装 Maestro 及其所有依赖项,这是一款移动端 UI 测试框架。

build-and-test.yml
build: name: 构建并测试 steps: - eas/build # ... simulator/emulator setup - eas/install_maestro: inputs: maestro_version: 1.35.0 - run: command: maestro test flows/signin.yml - eas/upload_artifact: name: 上传 Maestro 工件 inputs: type: build-artifact path: ${ eas.env.HOME }/.maestro/tests
InputTypeRequiredDescription
maestro_versionstring要安装的 Maestro 版本(例如 1.35.0)。如果未提供,install_maestro 将安装最新版本。
eas/install_maestro 源代码

在 GitHub 上查看 eas/install_maestro 函数的源代码。

eas/start_android_emulator

启动一个可用于测试应用的 Android 模拟器。仅在执行 Android 构建时可用。

build-and-test.yml
build: name: 构建并测试 steps: - eas/build - eas/start_android_emulator: inputs: system_image_package: system-images;android-30;default;x86_64 # ... Maestro setup and tests
InputTypeRequiredDescription
device_namestring创建的设备名称。如果启动多个模拟器,可以自定义此名称。
system_image_packagestring模拟器要使用的 Android 软件包路径。例如,system-images;android-30;default;x86_64。
若要获取可用系统映像列表,请在本地计算机上运行 sdkmanager --list。虚拟机运行于 x86_64 架构,因此请始终选择 x86_64 软件包变体。 sdkmanager 工具来自 Android SDK 命令行工具。
eas/start_android_emulator 源代码

在 GitHub 上查看 eas/start_android_emulator 函数的源代码。

eas/start_ios_simulator

启动一个可用于测试应用的 iOS 模拟器。仅在执行 iOS 构建时可用。

build-and-test.yml
build: name: 构建并测试 steps: - eas/build - eas/start_ios_simulator # ... Maestro setup and tests
InputTypeRequiredDescription
device_identifierstring要启动的模拟器名称或 UDID。示例包括 iPhone [XY] Pro、AEF997BB-222C-4379-89BA-D21070B1D787。
**注意:**每个映像可用的模拟器各不相同。如果更换映像,特定名称的模拟器可能会变得不可用。例如,Xcode 14 映像包含 iPhone 14 模拟器,而 Xcode 15 映像包含 iPhone 15 模拟器。通常建议不要提供此输入。有关详细信息,请参阅运行器映像。
eas/start_ios_simulator 源代码

在 GitHub 上查看 eas/start_ios_simulator 函数的源代码。

eas/send_slack_message

向配置的 Slack webhook URL 发送指定消息,然后将消息发布到相关 Slack 频道。消息可以指定为纯文本或 Slack Block Kit 消息。

你可以在消息中引用构建作业属性和使用其他步骤的输出,以便动态求值。 例如,'构建 URL:${ eas.job.expoBuildUrl }'、构建完成,状态:${ steps.run_fastlane.status_text }、构建失败,错误:${ steps.run_gradle.error_text }。

send-slack-message.yml
build: name: 通过自定义构建向你的团队发送 Slack 消息 steps: - eas/send_slack_message: name: 向给定的 webhook URL 发送 Slack 消息 inputs: message: 'This is a message to plain input URL' slack_hook_url: 'https://hooks.slack.com/services/[rest_of_hook_url]' - eas/send_slack_message: name: 向来自 SLACK_HOOK_URL 密钥的默认 webhook URL 发送 Slack 消息 inputs: message: 'This is a test message to default URL from SLACK_HOOK_URL secret' - eas/send_slack_message: name: 向来自指定密钥的 webhook URL 发送 Slack 消息 inputs: message: 'This is a test message to a URL from specified secret' slack_hook_url: ${ eas.env.ANOTHER_SLACK_HOOK_URL } - eas/build - eas/send_slack_message: if: ${ always() } name: 构建完成时发送 Slack 消息(Android) inputs: message: | This is a test message when Android build finishes Status: `${ steps.run_gradle.status_text }` Link: `${ eas.job.expoBuildUrl }` - eas/send_slack_message: if: ${ always() } name: 构建完成时发送 Slack 消息(iOS) inputs: message: | This is a test message when iOS build finishes Status: `${ steps.run_fastlane.status_text }` Link: `${ eas.job.expoBuildUrl }` - eas/send_slack_message: if: ${ failure() } name: 构建失败时发送 Slack 消息(Android) inputs: message: | This is a test message when Android build fails Error: `${ steps.run_gradle.error_text }` - eas/send_slack_message: if: ${ failure() } name: 构建失败时发送 Slack 消息(iOS) inputs: message: | This is a test message when iOS build fails Error: `${ steps.run_fastlane.error_text }` - eas/send_slack_message: if: ${ success() } name: 构建成功时发送 Slack 消息 inputs: message: | This is a test message when build succeeds - eas/send_slack_message: if: ${ always() } name: 使用 Slack Block Kit 布局发送 Slack 消息 inputs: payload: blocks: - type: section text: type: mrkdwn text: |- Hello, Sir Developer *Your build has finished!* - type: divider - type: section text: type: mrkdwn text: |- *${ eas.env.EAS_BUILD_ID }* *Status:* `${ steps.run_gradle.status_text }` *Link:* `${ eas.job.expoBuildUrl }` accessory: type: image image_url: [your_image_url] alt_text: 图片替代文本 - type: divider - type: actions elements: - type: button text: type: plain_text text: 'Do a thing :rocket:' emoji: true value: a_thing - type: button text: type: plain_text text: 'Do another thing :x:' emoji: true value: another_thing
PropertyTypeDescription
messagestring要发送的消息文本。例如,'This is the content of the message'。

**注意:**必须提供 message 或 payload,但不能同时提供两者。
payloadjson要发送的消息内容,使用 Slack Block Kit 布局定义。

**注意:**必须提供 message 或 payload,但不能同时提供两者。
slack_hook_urlstring之前配置的 Slack webhook URL,该 URL 会将你的消息发布到指定频道。请使用 EAS 环境变量 提供,例如 slack_hook_url: ${{ env.ANOTHER_SLACK_HOOK_URL }};或者设置 SLACK_HOOK_URL 环境变量,该变量将作为默认 webhook URL(在后一种情况下,无需提供 slack_hook_url 属性)。
eas/send_slack_message 源代码

在 GitHub 上查看 eas/send_slack_message 函数的源代码。

以下函数可将构建连接到 PostHog。运行 eas integrations:posthog:connect 以关联 PostHog 项目并设置这些函数读取的环境变量。eas/posthog_capture_event 使用公开的项目 API 密钥,而其他函数使用 PostHog 个人 API 密钥,所需权限范围在各函数中注明。有关设置,请参阅使用 PostHog;有关完整工作流,请参阅EAS Workflows 的 PostHog 配方。

eas/posthog_capture_event

向 PostHog 发送分析事件。可用于在 PostHog 时间线上标记构建、发布和其他重要节点。

如果未提供 distinct_id,事件将以匿名方式发送,且不会创建 PostHog 用户档案。

posthog-capture-event.yml
build: name: 构建并在 PostHog 中标记发布 steps: - eas/build - eas/posthog_capture_event: name: 捕获 PostHog 事件 inputs: event: store_build_finished properties: platform: ios profile: production
属性类型必填描述
eventstring要发送的事件名称。
distinct_idstring要将事件归因到的人员。省略时,事件将匿名发送,且不会创建人员档案。
propertiesjson要附加到事件的属性。
api_keystringPostHog 项目 API 密钥。默认为由 eas integrations:posthog:connect 设置的 EXPO_PUBLIC_POSTHOG_API_KEY 环境变量;如果未设置,则回退到 POSTHOG_API_KEY。
hoststringPostHog 主机。默认为 EXPO_PUBLIC_POSTHOG_HOST 环境变量,或 https://us.posthog.com。
ignore_errorboolean当值为 true 时,发送事件失败会记录日志,但不会导致步骤失败。默认为 false。
eas/posthog_capture_event 源代码

在 GitHub 上查看 eas/posthog_capture_event 函数的源代码。

eas/posthog_flag_rollout

启用、禁用或逐步推出 PostHog 功能标志。该函数会根据键查找标志,然后对其进行更新。请至少提供 active、rollout_percentage 或 payload 中的一个。

posthog-flag-rollout.yml
build: name: 逐步推出 PostHog 功能标志 steps: - eas/posthog_flag_rollout: name: 将标志逐步推出至 25% inputs: flag: new-checkout rollout_percentage: 25
PropertyTypeRequiredDescription
flagstring要更新的功能标志键。
activeboolean功能标志是否已启用。
rollout_percentagenumber功能标志面向的用户百分比,取值为 0 到 100 之间的整数。此函数会将其应用于功能标志的兜底发布条件,并保留其他条件。如果功能标志没有兜底条件,此函数会将其应用于第一个条件。
payloadjson要附加到功能标志的负载。
variantstring在多变量功能标志上用于存储 payload 的变体键。默认为功能标志的 true 负载。
api_keystringPostHog 个人 API 密钥。默认为 POSTHOG_CLI_API_KEY 环境变量。需要 feature_flag:read 和 feature_flag:write 作用域。
project_idstringPostHog 项目 ID。默认为 POSTHOG_CLI_PROJECT_ID 环境变量。
ignore_errorboolean为 true 时,网络错误、缺少功能标志或意外响应会被记录,但不会导致步骤失败。默认为 false。权限错误或无效输入(例如超出范围的 rollout_percentage)始终会导致步骤失败。
eas/posthog_flag_rollout 源代码

在 GitHub 上查看 eas/posthog_flag_rollout 函数的源代码。

eas/posthog_wait_for_metric

暂停执行,直到 HogQL 查询返回满足比较条件的数字。可用于根据指标设置门槛,例如等待最近几分钟的错误数量保持在较低水平。该函数会每隔 interval_seconds 运行一次查询,直到比较结果为真或经过 timeout_seconds。

posthog-wait-for-metric.yml
build: name: 根据错误数量设置门槛 steps: - eas/posthog_wait_for_metric: name: 等待错误数量保持在较低水平 inputs: query: SELECT count() FROM events WHERE event = '$exception' AND timestamp > now() - INTERVAL 15 MINUTE operator: lt threshold: 10
属性类型必填描述
querystringHogQL 查询。第一行的第一列必须是单个数字。
operatorstring比较运算符。可以是 lt、lte、gt、gte 或 eq 之一。当 value <operator> threshold 成立时,步骤将清除。
thresholdnumber用于与查询结果进行比较的值。
timeout_secondsnumber等待的最长时间,以秒为单位。默认为 600。
interval_secondsnumber检查之间的时间间隔,以秒为单位。默认为 30。
api_keystringPostHog 个人 API 密钥。默认为 POSTHOG_CLI_API_KEY 环境变量。需要 query:read 权限范围。
project_idstringPostHog 项目 ID。默认为 POSTHOG_CLI_PROJECT_ID 环境变量。
输出
属性类型描述
valuestring满足比较条件的指标值。
eas/posthog_wait_for_metric 源代码

在 GitHub 上查看 eas/posthog_wait_for_metric 函数的源代码。

eas/posthog_wait_for_query

暂停执行,直到 HogQL 查询返回 true。当条件更适合直接在查询中表达时使用此函数。若要执行带有明确阈值的数值比较,请改用 eas/posthog_wait_for_metric。当第一行第一列的值为 true 或非零数字时,此步骤将结束。

posthog-wait-for-query.yml
build: name: 等待 smoke test 事件 steps: - eas/posthog_wait_for_query: name: 等待 smoke test 通过 inputs: query: SELECT count() > 0 FROM events WHERE event = 'smoke_test_passed' AND timestamp > now() - INTERVAL 30 MINUTE
属性类型必填描述
querystringHogQL 查询。当第一行的第一列为 true 或非零数字时,该步骤将清除。
timeout_secondsnumber最大等待时间,以秒为单位。默认为 600。
interval_secondsnumber检查之间的间隔时间,以秒为单位。默认为 30。
api_keystringPostHog 个人 API 密钥。默认为 POSTHOG_CLI_API_KEY 环境变量。需要 query:read 作用域。
project_idstringPostHog 项目 ID。默认为 POSTHOG_CLI_PROJECT_ID 环境变量。
eas/posthog_wait_for_query 源代码

在 GitHub 上查看 eas/posthog_wait_for_query 函数的源代码。

eas/posthog_annotation

在项目时间线上创建 PostHog annotation。Annotation 会显示在 PostHog 图表上,因此适合在受其影响的指标旁标记构建、发布和其他里程碑。

posthog-annotation.yml
build: name: 在 PostHog 中标记发布 steps: - eas/posthog_annotation: name: 创建 PostHog annotation inputs: content: Published a production build
属性类型必填描述
contentstring注释文本。
date_markerstring注释固定到的 ISO 8601 时间戳。默认为当前时间。
api_keystringPostHog 个人 API 密钥。默认为 POSTHOG_CLI_API_KEY 环境变量。需要 annotation:write 作用域。
project_idstringPostHog 项目 ID。默认为 POSTHOG_CLI_PROJECT_ID 环境变量。
ignore_errorboolean当值为 true 时,会记录网络错误或意外响应,但不会使步骤失败。默认为 false。权限错误始终会使步骤失败。
eas/posthog_annotation 源代码

在 GitHub 上查看 eas/posthog_annotation 函数的源代码。

eas/posthog_upload_sourcemaps

将 JavaScript source map 上传到 PostHog,以便 PostHog 在 error tracking 中对堆栈跟踪进行符号化。请在生成 bundle 的步骤之后、同一任务中运行此步骤,以确保 bundle 和 source map 均可在磁盘上获取。使用 npx expo export --source-maps 导出,并根据 Source maps 指南配置 PostHog Metro config,让 bundle 携带可将其与对应 source map 匹配的 chunk ID。

posthog-upload-sourcemaps.yml
build: name: 导出并上传 source map steps: - eas/checkout - eas/install_node_modules - run: name: 导出 bundle 和 source map command: npx expo export --source-maps --platform ios - eas/posthog_upload_sourcemaps: name: 将 source map 上传到 PostHog inputs: directory: dist
属性类型必填描述
directorystring包含 bundle 和源映射的目录,相对于工作目录。默认为 dist。
api_keystringPostHog 个人 API 密钥。默认为 POSTHOG_CLI_API_KEY 环境变量。需要源映射上传权限。
project_idstringPostHog 项目 ID。默认为 POSTHOG_CLI_PROJECT_ID 环境变量。
ignore_errorboolean当为 true 时,上传失败会被记录,但不会导致步骤失败。默认为 false。
eas/posthog_upload_sourcemaps 源代码

在 GitHub 上查看 eas/posthog_upload_sourcemaps 函数的源代码。

使用内置 EAS 函数构建应用

使用内置 EAS 函数,你可以为不同的构建类型重建默认的 EAS Build 流程。

例如,要触发一个为 Android 创建内部分发构建、为 iOS 创建模拟器构建的任务,你可以使用以下配置:

eas.json
{ %%placeholder-start%%... %%placeholder-end%% "build": { %%placeholder-start%%... %%placeholder-end%% "developmentBuild": { "distribution": "internal", "android": { "config": "development-build-android.yml" }, "ios": { "simulator": true, "config": "development-build-ios.yml" } } %%placeholder-start%%... %%placeholder-end%% } %%placeholder-start%%... %%placeholder-end%% }
.eas/build/development-build-android.yml
build: name: 简单的 Android 内部分发构建 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/inject_android_credentials - eas/run_gradle - eas/find_and_upload_build_artifacts
.eas/build/development-build-ios.yml
build: name: 简单的 iOS 模拟器构建 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - run: name: 安装 pods working_directory: ./ios command: pod install - eas/generate_gymfile_from_template - eas/run_fastlane - eas/find_and_upload_build_artifacts

要为 Android 创建 Google Play 商店构建并为 iOS 创建 Apple App Store 构建,你可以使用以下配置:

eas.json
{ %%placeholder-start%%... %%placeholder-end%% "build": { %%placeholder-start%%... %%placeholder-end%% "productionBuild": { "android": { "config": "production-build-android.yml" }, "ios": { "config": "production-build-ios.yml" } } %%placeholder-start%%... %%placeholder-end%% } %%placeholder-start%%... %%placeholder-end%% }
.eas/build/production-build-android.yml
build: name: 自定义 Android Play Store 构建示例 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/inject_android_credentials - eas/run_gradle - eas/find_and_upload_build_artifacts
.eas/build/production-build-ios.yml
build: name: 自定义 iOS App Store 构建示例 steps: - eas/checkout - eas/install_node_modules - eas/resolve_apple_team_id_from_credentials: id: resolve_apple_team_id_from_credentials - eas/prebuild: inputs: apple_team_id: ${ steps.resolve_apple_team_id_from_credentials.apple_team_id } - run: name: 安装 pods working_directory: ./ios command: pod install - eas/configure_ios_credentials - eas/generate_gymfile_from_template: inputs: credentials: ${ eas.job.secrets.buildCredentials } - eas/run_fastlane - eas/find_and_upload_build_artifacts

查看 示例仓库 以获取更详细的示例:

自定义构建示例仓库

一个自定义 EAS Build 示例,其中包含设置函数、使用环境变量、上传工件等自定义构建示例。

在 build 中使用可复用函数

例如,包含以下可复用函数的自定义构建配置包含一条用于打印回显消息的命令。

functions: greetings: - name: name default_value: Hello world inputs: [value] command: echo "${ inputs.name }, { inputs.value }"

上述函数可以在 build 中如下使用:

build: name: 函数演示 steps: - greetings: inputs: value: Expo

在 build 中覆盖值

你可以为以下属性覆盖值:

  • working_directory
  • name
  • shell

例如,一个名为 list_files 的可复用函数:

functions: list_files: name: 列出文件 command: ls -la

当在 build 配置中调用 list_files 时,它会列出项目根目录中的所有文件:

build: name: 列出文件 steps: - eas/checkout - list_files

你可以使用 working_directory 属性来覆盖函数调用中的行为,通过指定该目录的路径,来列出不同目录中的文件:

build: name: 列出文件 steps: - eas/checkout - list_files: working_directory: /a/b/c