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"
注意:
run前面的-计入缩进。
使用多个步骤
当定义多个 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 变量暴露给其他步骤。
注意: 使用
set-env共享的变量不会自动在本地导出。你需要自己调用export。
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 命令插值中。
警告 我们观察到,如果在安装了 Xcode 15.0 或 15.2 的镜像上运行,Maestro 测试经常会超时。请使用
latest镜像以避免任何问题。
对于基于 Git 的项目源,默认情况下,该步骤会使用构建记录的提交。使用 ref 可以检出其他分支、标签或提交:
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 之前,因为后者会在内部检出项目
在 GitHub 上查看 eas/checkout 函数的源代码。
eas/use_npm_token
配置 Node 包管理器(bun、npm、pnpm 或 Yarn),以便使用发布到 npm 或私有注册表中的私有包
在项目的 secrets 中设置 NPM_TOKEN,此函数会通过创建包含该令牌的 .npmrc 来配置构建环境
在 GitHub 上查看 eas/use_npm_token 函数的源代码。
eas/install_node_modules
使用根据项目检测到的包管理器(bun、npm、pnpm 或 Yarn)安装 node_modules。支持 monorepo
在 GitHub 上查看 eas/install_node_modules 函数的源代码。
eas/restore_build_cache
从指定的 key 恢复之前保存的构建缓存。这对于通过复用已缓存的产物(如编译后的依赖、构建工具或其他中间构建输出)来加快构建速度非常有用。
在 GitHub 上查看 eas/restore_build_cache 函数的源代码。
eas/save_build_cache
将构建缓存保存到指定的键。这使你能够持久保存构建产物、编译后的依赖项或其他中间输出,以便在后续构建中复用,从而加快构建流程。
在 GitHub 上查看 eas/save_build_cache 函数的源代码。
eas/resolve_build_config
解析并打印构建配置。如果构建由 GitHub 集成触发,它会更新当前的 job 和 metadata 上下文值。应在安装依赖项之后调用,因为配置可能会受到配置插件的影响。
该函数会被 eas/build 函数组自动执行。
在 GitHub 上查看 eas/resolve_build_config 函数的源代码。
eas/get_credentials_for_build_triggered_by_github_integration
已弃用: 请使用
eas/resolve_build_config替换此步骤。
eas/resolve_apple_team_id_from_credentials
此函数仅适用于 iOS 构建。
根据在 inputs.credentials 中提供的构建凭据解析 Apple team ID 值。解析得到的 Apple team ID 会存储在 outputs.apple_team_id 输出值中。
在 GitHub 上查看 eas/resolve_apple_team_id_from_credentials 函数的源代码。
eas/prebuild
使用根据项目检测到的包管理器(bun、npm、pnpm 或 Yarn),运行最适合构建类型和构建环境的 expo prebuild 命令。
在 GitHub 上查看 eas/prebuild 函数的源代码。
eas/configure_eas_update
使用此函数需要为你的项目配置 EAS Update。
为构建配置运行时版本和发布通道。
在 GitHub 上查看 eas/configure_eas_update 函数的源代码。
eas/inject_android_credentials
此函数仅适用于 Android 构建。
在构建机上使用凭据配置 Android keystore,并使用这些凭据将应用签名配置注入 Gradle 配置中。
在 GitHub 上查看 eas/inject_android_credentials 函数的源代码。
eas/configure_ios_credentials
此函数仅适用于 iOS 构建。
在构建机上配置 iOS 凭据。通过将 provisioning profiles 分配给各个 targets 来修改 Xcode 项目的配置。
在 GitHub 上查看 eas/configure_ios_credentials 函数的源代码。
eas/configure_android_version
此函数仅适用于 Android 构建。
配置 Android 应用的版本。在使用远程应用版本管理时,可用它来设置版本。
不使用此函数也没关系;如果未使用,则会采用 prebuild 阶段生成的原生代码中的版本。
在 GitHub 上查看 eas/configure_android_version 函数的源代码。
eas/configure_ios_version
此函数仅适用于 iOS 构建。
配置 iOS 应用的版本。在使用远程应用版本管理时,可用它来设置版本。
不使用此函数也没关系;如果未使用,则会采用 prebuild 阶段生成的原生代码中的版本。
在 GitHub 上查看 eas/configure_ios_version 函数的源代码。
eas/run_gradle
此函数仅适用于 Android 构建。
运行 Gradle 命令以构建 Android 应用。
在 GitHub 上查看 eas/run_gradle 函数的源代码。
eas/generate_gymfile_from_template
此函数仅适用于 iOS 构建。
从模板生成一个用于通过 Fastlane 构建 iOS 应用的 Gymfile。
使用凭据时的默认模板:
未传入凭据时使用的默认模板(模拟器构建):
CLEAN、SCHEME、BUILD_CONFIGURATION、EXPORT_METHOD、PROFILES、ICLOUD_CONTAINER_ENVIRONMENT、KEYCHAIN_PATH、LOGS_DIRECTORY、OUTPUT_DIRECTORY、DERIVED_DATA_PATH 和 SCHEME_SIMULATOR_DESTINATION 的值会根据输入以及 EAS Build 的默认内部配置提供给模板。
不过,你也可以通过在 inputs.template 中指定自定义模板,并在 inputs.extra 对象中提供这些自定义属性的值,在模板中使用其他自定义属性。
在 GitHub 上查看 eas/generate_gymfile_from_template 函数的源代码。
eas/run_fastlane
警告 此函数仅适用于 iOS 构建。
在 ios 项目目录中,针对位于该目录下的 Gymfile 运行 fastlane gym 命令,以构建 iOS 应用。
在 GitHub 上查看 eas/run_fastlane 函数的源代码。
eas/find_and_upload_build_artifacts
警告 你目前每个构建任务中每种工件类型只能上传一次。
如果你在构建配置中设置了buildArtifactPaths,并且使用了eas/find_and_upload_build_artifacts,而该步骤找到了并上传了一些构建工件,那么后续的任何eas/upload_artifact步骤都会失败。
为了解决这个问题,目前我们建议从自定义构建的配置中移除buildArtifactPaths,并在需要时在 YAML 中使用eas/upload_artifact手动上传工件。
自动从默认位置以及使用 buildArtifactPaths 配置中查找并上传应用归档、其他构建工件和 Xcode 日志。将找到的工件上传到 EAS 服务器。
在 GitHub 上查看 eas/find_and_upload_build_artifacts 函数的源代码。
eas/upload_artifact
将作业工作区中的文件作为工件附加到运行中。上传的工件会显示在运行的 Artifacts 部分,并可在后续作业中通过 eas/download_artifact 获取。
警告 你目前每个构建任务中每种工件类型只能上传一次。
如果你在构建配置中设置了buildArtifactPaths,并且使用了eas/find_and_upload_build_artifacts,而该步骤找到了并上传了一些构建工件,那么后续的任何eas/upload_artifact步骤都会失败。
为了解决这个问题,目前我们建议从自定义构建的配置中移除buildArtifactPaths,并在需要时在 YAML 中使用eas/upload_artifact手动上传工件。
输出
在 GitHub 上查看 eas/upload_artifact 函数的源代码。
eas/install_maestro
确保已安装 Maestro 及其所有依赖项,这是一款移动端 UI 测试框架。
在 GitHub 上查看 eas/install_maestro 函数的源代码。
eas/start_android_emulator
启动一个可用于测试应用的 Android 模拟器。仅在执行 Android 构建时可用。
警告 启动 Android Emulator 时,项目必须配置为使用旧版 Build Infrastructure。前往 Project settings 进行配置。有关详细信息,请参阅此更新日志文章。
在 GitHub 上查看 eas/start_android_emulator 函数的源代码。
eas/start_ios_simulator
启动一个可用于测试应用的 iOS 模拟器。仅在执行 iOS 构建时可用。
在 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 }。
在 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 用户档案。
在 GitHub 上查看 eas/posthog_capture_event 函数的源代码。
eas/posthog_flag_rollout
启用、禁用或逐步推出 PostHog 功能标志。该函数会根据键查找标志,然后对其进行更新。请至少提供 active、rollout_percentage 或 payload 中的一个。
在 GitHub 上查看 eas/posthog_flag_rollout 函数的源代码。
eas/posthog_wait_for_metric
暂停执行,直到 HogQL 查询返回满足比较条件的数字。可用于根据指标设置门槛,例如等待最近几分钟的错误数量保持在较低水平。该函数会每隔 interval_seconds 运行一次查询,直到比较结果为真或经过 timeout_seconds。
信息 此步骤没有
ignore_error输入。超时或查询无法读取时,此步骤都会失败。
输出
在 GitHub 上查看 eas/posthog_wait_for_metric 函数的源代码。
eas/posthog_wait_for_query
暂停执行,直到 HogQL 查询返回 true。当条件更适合直接在查询中表达时使用此函数。若要执行带有明确阈值的数值比较,请改用 eas/posthog_wait_for_metric。当第一行第一列的值为 true 或非零数字时,此步骤将结束。
信息 与
eas/posthog_wait_for_metric一样,此步骤没有ignore_error输入。超时或查询无法读取时,步骤始终会失败。
在 GitHub 上查看 eas/posthog_wait_for_query 函数的源代码。
eas/posthog_annotation
在项目时间线上创建 PostHog annotation。Annotation 会显示在 PostHog 图表上,因此适合在受其影响的指标旁标记构建、发布和其他里程碑。
在 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 CLI,它无法区分权限错误和其他故障。与其他 PostHog 函数不同,设置
ignore_error: true也会隐藏身份验证和作用域错误。
在 GitHub 上查看 eas/posthog_upload_sourcemaps 函数的源代码。
使用内置 EAS 函数构建应用
使用内置 EAS 函数,你可以为不同的构建类型重建默认的 EAS Build 流程。
例如,要触发一个为 Android 创建内部分发构建、为 iOS 创建模拟器构建的任务,你可以使用以下配置:
要为 Android 创建 Google Play 商店构建并为 iOS 创建 Apple App Store 构建,你可以使用以下配置:
查看 示例仓库 以获取更详细的示例:
一个自定义 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.steps可以按顺序执行多个可复用的functions。
在 build 中覆盖值
你可以为以下属性覆盖值:
working_directorynameshell
例如,一个名为 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