自定义构建配置 schema
编辑页面
EAS Build 自定义构建的配置选项参考。
For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.
为 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 命令插值中。
functions: greetings: name: 说你好! inputs: - name: name default_value: 你好,世界 command: echo "${ inputs.name }!"
inputs[].required
布尔值,表示输入值是否必填。例如,一个函数没有必填值:
functions: greetings: name: 说你好! inputs: - name: name required: false
inputs[].type
输入值的类型。它可以是 string、num 或 json。
在函数调用中设置的输入值,以及函数的 default_value 和 allowed_values 都会根据该类型进行验证。
默认的输入 type 是 string。
例如,一个函数有一个类型为 string 的输入值:
functions: greetings: name: 说你好! inputs: - name: name type: string - name: age type: num - name: other_data type: json
inputs[].default_value
你可以使用 default_value 提供一个默认输入值。例如,一个函数的默认值是 Hello world:
functions: greetings: name: 说你好! inputs: - name: name default_value: 你好,世界
inputs[].allowed_values
你可以使用 allowed_values 在数组中提供多个值。例如,一个函数有多个允许的值:
functions: greetings: name: 说你好! inputs: - name: name default_value: 你好,世界 allowed_values: [Hi, Hello, Hey] type: string
多个输入值
可以为一个函数提供多个输入值。
functions: greetings: name: 说你好! inputs: - name: name default_value: Expo - name: greeting default_value: Hi allowed_values: [Hi, Hello] command: echo "${ inputs.greeting }, ${ inputs.name }!"
functions.[function_name].outputs
函数会期望返回一个输出值。例如,一个函数的输出值是 Hello world:
functions: greetings: name: 说你好! outputs: [value] command: set-output value "Hello world"
outputs[].name
输出值的名称。它作为标识符,用于在另一步骤中访问该输出值:
functions: greetings: name: 说你好! outputs: - name: name
outputs[].required
布尔值,表示输出值是否必填。例如,一个函数没有必填的输出值:
functions: greetings: name: 说你好! outputs: - name: value required: false
functions.[function_name].command
用于定义函数执行时要运行的命令,如果你希望该函数是一个简单的 shell 脚本。每个函数都必须定义 command 或实现该函数的 JS/TS 模块 path。例如,命令 echo "Hello world" 用于打印一条消息:
functions: greetings: name: 说你好! command: echo "你好!"
functions.[function_name].path
用于定义实现该函数的 JavaScript/TypeScript 模块路径。每个函数都必须定义 command 或 path 属性。例如,路径 ./greetings 用于执行在 greetings 模块中声明的 greetings 函数:
functions: greetings: name: 说你好! path: ./greetings
functions.[function_name].shell
用于定义执行函数的步骤所使用的默认可执行 shell。例如,该步骤的 shell 设置为 /bin/sh:
functions: greetings: name: 说你好! shell: /bin/sh command: echo "你好!"
functions.[function_name].supported_platforms
用于定义函数支持的平台。默认支持所有平台。允许的平台:darwin、linux。
例如,该函数支持的平台是 darwin(macOS):
functions: greetings: name: 说你好! supported_platforms: [darwin] command: echo "你好!"
import
用于从其他配置文件导入函数的配置文件路径列表。被导入的文件不能包含 build 部分。
例如,下面的构建配置导入了两个文件,并调用了两个导入的函数——say_hi 和 say_bye。
import: - common-functions.yml - another-file.yml build: steps: - say_hi - say_bye
functions: say_hi: name: 说你好! command: echo "你好!"
functions: say_bye: name: 说再见 :( command: echo "再见!"
函数
内置 EAS 函数
EAS 提供了一组可重用的内置函数,你可以在构建配置中直接使用,而无需定义函数声明。
提示: 任何由 EAS 内置提供的函数都必须以eas/前缀开头。
eas/build
一个集成式函数,封装整个 EAS Build 的构建流程。它会根据你的构建配置文件 eas.json 中的构建配置来解析出最佳构建方案。
对于那些希望无需手动调整和配置构建流程就能完成构建的人来说,它非常理想。如果你希望在构建前后添加其他自定义步骤,但又不想改变构建流程本身,它也可以作为自定义构建配置的良好起点。
build: name: 使用单个命令运行构建 steps: - eas/build
如果你希望对构建流程有更多控制,并根据需求进行自定义,可以查看下面这些由 eas/build 在后台执行的自定义函数和步骤。它们会根据你的构建配置作为构建流程执行。
Android
当构建配置使用 withoutCredentials 时:
eas/checkouteas/use_npm_tokeneas/install_node_moduleseas/resolve_build_configeas/prebuildeas/configure_eas_updateeas/run_gradleeas/find_and_upload_build_artifacts
当构建配置使用凭据时(适用于 internal 和 store distribution 构建):
eas/checkouteas/use_npm_tokeneas/install_node_moduleseas/resolve_build_configeas/prebuildeas/configure_eas_updateeas/inject_android_credentialseas/configure_android_versioneas/run_gradleeas/find_and_upload_build_artifacts
iOS
当构建配置使用 withoutCredentials 或 simulator 时:
eas/checkouteas/use_npm_tokeneas/install_node_moduleseas/resolve_build_configeas/prebuild- 使用
pod install命令安装 pods eas/configure_eas_updateeas/generate_gymfile_from_templateeas/run_fastlaneeas/find_and_upload_build_artifacts
当构建配置使用凭据时(适用于 internal 和 store distribution 构建):
eas/checkouteas/use_npm_tokeneas/install_node_moduleseas/resolve_build_configeas/resolve_apple_team_id_from_credentialseas/prebuild- 使用
pod install命令安装 pods eas/configure_eas_updateeas/configure_ios_credentialseas/configure_ios_versioneas/generate_gymfile_from_templateeas/run_fastlaneeas/find_and_upload_build_artifacts
你可以在 YAML 配置文件中使用这些步骤来替换 eas/build 命令调用:
查看我们示例仓库中由 `eas/build` 函数在 iOS 模拟器构建中幕后执行的步骤。
查看我们示例仓库中由 `eas/build` 函数在带凭据的 iOS 构建中幕后执行的步骤。
查看我们示例仓库中由 `eas/build` 函数在不带凭据的 Android 构建中幕后执行的步骤。
查看我们示例仓库中由 `eas/build` 函数在带凭据的 Android 构建中幕后执行的步骤。
已知限制
- 它不接受任何输入,解析后的构建流程将根据你在 eas.json 中的构建配置进行设置。
eas/build生成的构建流程不可配置,你无法对其进行自定义。如果你需要自定义构建流程,请使用该函数在幕后执行的那一组函数和步骤,并像上面的示例那样在 YAML 配置文件中手动配置它们。
eas/maestro_test
一个集成式函数,用于安装 Maestro、准备测试环境(Android Emulator 或 iOS Simulator),并测试应用。
| 输入 | 类型 | 描述 |
|---|---|---|
flow_path | string | 要运行的 Maestro flows 的路径(也可以是多个路径,每个路径单独一行)。 |
app_path | string | 需要测试的模拟器/仿真器应用路径(或正则模式)。如果未提供,Android 默认为 android/app/build/outputs/**/*.apk,iOS 默认为 ios/build/Build/Products/*simulator/*.app。 |
build: name: 构建并测试 steps: - eas/build - eas/maestro_test: inputs: flow_path: | maestro/sign_in.yml maestro/create_post.yml maestro/sign_out.yml
build: name: 构建并测试 iOS 模拟器应用 steps: - eas/checkout - eas/maestro_test: app_path: ./fixtures/my_app.app inputs: flow_path: | maestro/sign_in.yml maestro/create_post.yml maestro/sign_out.yml
build: name: 构建并测试 Android 模拟器应用 steps: - eas/checkout - eas/maestro_test: app_path: ./fixtures/my_app.apk inputs: flow_path: | maestro/sign_in.yml maestro/create_post.yml maestro/sign_out.yml
其幕后会使用:
eas/install_maestro安装 Maestro- 如果需要,使用
eas/start_android_emulator启动 Android Emulator - 如果需要,使用
eas/start_ios_simulator启动 iOS Simulator - 自定义
run,将 .apk 安装到正在运行的 Android Emulator,将 .app 安装到 iOS Simulator - 一系列
run,对提供的每个 flow 执行maestro test eas/upload_artifact将 Maestro 测试产物作为构建产物上传
我们观察到,如果在安装了 Xcode 15.0 或 15.2 的镜像上运行,Maestro 测试经常会超时。请使用latest镜像以避免任何问题。
如果你需要自定义 Maestro 版本、运行特定的 Android Emulator 或 iOS Simulator,或者上传多个构建产物,就需要自行编写这组步骤。
`eas/maestro_test` 展开后的 Android 构建配置示例
build: name: 构建并测试(Android,展开后) steps: - eas/build - eas/install_maestro - eas/start_android_emulator: inputs: system_package_name: system-images;android-34;default;x86_64 - run: command: | # shopt -s globstar 是添加 /**/ 支持所必需的 shopt -s globstar # shopt -s nullglob 是为了避免在没有匹配文件时 # 直接尝试安装 SEARCH_PATH 字面值。 shopt -s nullglob SEARCH_PATH="android/app/build/outputs/**/*.apk" FILES_FOUND=false for APP_PATH in $SEARCH_PATH; do FILES_FOUND=true echo "Installing \\"$APP_PATH\\"" adb install "$APP_PATH" done if ! $FILES_FOUND; then echo "No files found matching \\"$SEARCH_PATH\\". Are you sure you've built an Emulator app?" exit 1 fi - run: command: | maestro test maestro/flow.yml - eas/upload_artifact: name: 上传测试产物 if: ${ always() } inputs: type: build-artifact path: ${ eas.env.HOME }/.maestro/tests
`eas/maestro_test` 展开后的 iOS 构建配置示例
build: name: 构建并测试(iOS,展开后) steps: - eas/build - eas/install_maestro - eas/start_ios_simulator - run: command: | # shopt -s nullglob 是为了避免在没有匹配文件时 # 直接尝试安装 SEARCH_PATH 字面值。 shopt -s nullglob SEARCH_PATH="ios/build/Build/Products/*simulator/*.app" FILES_FOUND=false for APP_PATH in $SEARCH_PATH; do FILES_FOUND=true echo "Installing \\"$APP_PATH\\"" xcrun simctl install booted "$APP_PATH" done if ! $FILES_FOUND; then echo "No files found matching \\"$SEARCH_PATH\\". Are you sure you've built a Simulator app?" exit 1 fi - run: command: | maestro test maestro/flow.yml - eas/upload_artifact: name: 上传测试产物 if: ${ always() } inputs: type: build-artifact path: ${ eas.env.HOME }/.maestro/tests
在 GitHub 上查看 eas/maestro_test 函数的源代码。
eas/checkout
检出你的项目源文件。
例如,包含以下 steps 的构建配置会检出项目并列出 assets 目录中的文件:
build: name: 列出文件 steps: - eas/checkout - run: name: 列出 assets run: ls assets
在 GitHub 上查看 eas/checkout 函数的源代码。
eas/use_npm_token
配置 node 包管理器(npm、pnpm 或 Yarn)以使用私有包,这些包可以发布到 npm 或私有 registry。
在你的项目 secrets 中设置 NPM_TOKEN,该函数会通过创建包含该 token 的 .npmrc 来配置构建环境。
build: name: 安装私有 npm 模块 steps: - eas/checkout - eas/use_npm_token - run: name: 安装依赖 run: npm install # <---- 现在可以安装私有包了
在 GitHub 上查看 eas/use_npm_token 函数的源代码。
eas/install_node_modules
使用根据你的项目检测到的包管理器(npm、pnpm 或 Yarn)安装 node 模块。支持 monorepo。
build: name: 安装 node 模块 steps: - eas/checkout - eas/install_node_modules
在 GitHub 上查看 eas/install_node_modules 函数的源代码。
eas/restore_build_cache
从指定的 key 恢复之前保存的构建缓存。这对于通过复用已缓存的产物(如编译后的依赖、构建工具或其他中间构建输出)来加快构建速度非常有用。
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
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.key | string | 必填。要恢复的缓存 key。你可以使用 ${{ hashFiles('package-lock.json') }} 之类的表达式,根据文件哈希创建动态 key。 |
inputs.restore_keys | string | 可选。如果找不到精确的 key,可使用的备用 key 或前缀。如果提供,缓存系统会查找任何以该前缀开头的缓存条目。 |
inputs.path | string | 必填。应恢复缓存的路径。这应与保存缓存时使用的路径匹配。 |
在 GitHub 上查看 eas/restore_build_cache 函数的源代码。
eas/save_build_cache
将构建缓存保存到指定的 key。这使你能够持久化构建产物、编译后的依赖或其他中间输出,以便在后续构建中复用,从而加快构建流程。
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.key | string | 必填。缓存要保存到的 key。你可以使用 ${{ hashFiles('package-lock.json') }} 之类的表达式,根据文件哈希创建动态 key。这应与恢复缓存时使用的 key 匹配。 |
inputs.path | string | 必填。需要缓存的目录或文件路径。这应与恢复缓存时使用的路径匹配。 |
在 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 输出值中。
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 }
| 属性 | 类型 | 描述 |
|---|---|---|
name | string | 在构建日志中显示的可重用函数步骤名称。默认值为 Resolve Apple team ID from credentials。 |
inputs.credentials | json | 可选输入,用于定义 iOS 构建的应用凭据。默认值为 ${ eas.job.secrets.buildCredentials }。需要符合 iOS 的 ${ eas.job.secrets.buildCredentials } schema。 |
在 GitHub 上查看 eas/resolve_apple_team_id_from_credentials 函数的源代码。
eas/prebuild
使用根据你的项目检测到的包管理器(npm、pnpm 或 Yarn),并采用最适合你的构建类型和构建环境的命令来运行 expo prebuild 命令。
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 }
build: name: 运行 prebuild 脚本 steps: - eas/checkout - eas/install_node_modules - eas/prebuild
| 属性 | 类型 | 描述 |
|---|---|---|
name | - | 在构建日志中显示的可重用函数步骤名称。默认值为 Prebuild。 |
inputs.clean | boolean | 可选输入,定义运行命令时该函数是否应使用 --clean 标志。默认值为 false |
inputs.apple_team_id | boolean | 可选输入,定义进行 prebuild 时应使用的 Apple team ID。对于使用凭据的 iOS 构建,应指定此项。 |
在 GitHub 上查看 eas/resolve_apple_team_id_from_credentials 函数的源代码。
eas/configure_eas_update
使用此函数需要为你的项目配置 EAS Update。
为你的构建配置运行时版本和发布通道。
build: name: 配置 EAS Update steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update
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_version | string | 可选输入,定义应为构建配置的运行时版本。默认值为 ${ eas.job.version.runtimeVersion } 或原生定义的运行时版本。 |
inputs.channel | string | 可选输入,定义应为构建配置的通道。默认值为 ${ eas.job.updates.channel }。 |
在 GitHub 上查看 eas/configure_eas_update 函数的源代码。
eas/inject_android_credentials
此函数仅适用于 Android 构建。
在构建机上使用凭据配置 Android keystore,并使用这些凭据将应用签名配置注入 gradle 配置中。
build: name: Android 凭据 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/inject_android_credentials
| 属性 | 类型 | 描述 |
|---|---|---|
name | - | 在构建日志中显示的可重用函数步骤名称。默认值为 Inject Android credentials。 |
inputs.credentials | json | 可选输入,用于定义 Android 构建的应用凭据。默认值为 ${ eas.job.secrets.buildCredentials }。需要符合 Android 的 ${ eas.job.secrets.buildCredentials } schema。 |
在 GitHub 上查看 eas/inject_android_credentials 函数的源代码。
eas/configure_ios_credentials
此函数仅适用于 iOS 构建。
在构建机上配置 iOS 凭据。通过将 provisioning profiles 分配给各个 targets 来修改 Xcode 项目的配置。
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_configuration | string | 可选输入,定义 Xcode 项目的 Build Configuration。默认值为 ${ eas.job.buildConfiguration },如果未指定,则对 development client 解析为 Debug,对其他构建解析为 Release。 |
inputs.credentials | json | 可选输入,用于定义 iOS 构建的应用凭据。默认值为 ${ eas.job.secrets.buildCredentials }。需要符合 iOS 的 ${ eas.job.secrets.buildCredentials } schema。 |
在 GitHub 上查看 eas/configure_ios_credentials 函数的源代码。
eas/configure_android_version
此函数仅适用于 Android 构建。
配置 Android 应用的版本。它用于在使用远程应用版本管理时设置版本。
如果不使用此函数也没关系;如果未使用,则会采用 prebuild 阶段生成的原生代码中的版本。
build: name: 配置 Android 版本 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update - eas/inject_android_credentials - eas/configure_android_version
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_code | string | 可选输入,定义 Android 构建的 versionCode。默认值为 ${ eas.job.version.versionCode } |
inputs.version_name | string | 可选输入,定义 Android 构建的 versionName。默认值为 ${ eas.job.version.versionName }。 |
在 GitHub 上查看 eas/configure_android_version 函数的源代码。
eas/configure_ios_version
此函数仅适用于 iOS 构建。
配置 iOS 应用的版本。它用于在使用远程应用版本管理时设置版本。
如果不使用此函数也没关系;如果未使用,则会采用 prebuild 阶段生成的原生代码中的版本。
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
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_number | string | 可选输入,定义 iOS 构建的构建号(CFBundleVersion)。默认值为 ${ eas.job.version.buildNumber } |
inputs.app_version | string | 可选输入,定义 iOS 构建的应用版本(CFBundleShortVersionString)。默认值为 ${ eas.job.version.appVersion }。 |
inputs.build_configuration | string | 可选输入,定义 Xcode 项目的 Build Configuration。默认值为 ${ eas.job.buildConfiguration },如果未指定,则对 development client 解析为 Debug,对其他构建解析为 Release。 |
inputs.credentials | json | 可选输入,用于定义 iOS 构建的应用凭据。默认值为 ${ eas.job.secrets.buildCredentials }。需要符合 iOS 的 ${ eas.job.secrets.buildCredentials } schema。 |
在 GitHub 上查看 eas/configure_ios_version 函数的源代码。
eas/run_gradle
此函数仅适用于 Android 构建。
运行 Gradle 命令以构建 Android 应用。
build: name: 构建 Android 应用 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update - eas/inject_android_credentials - eas/run_gradle
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.command | string | 可选输入,定义用于构建 Android 应用的 Gradle 命令。如果未指定,则会根据构建配置和 ${ eas.job } 对象的内容进行解析。 |
在 GitHub 上查看 eas/run_gradle 函数的源代码。
eas/generate_gymfile_from_template
此函数仅适用于 iOS 构建。
从模板生成一个用于通过 Fastlane 构建 iOS 应用的 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 %>")
未传入凭据时使用的默认模板(模拟器构建):
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 的默认内部配置提供给模板。
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 }
build: name: 生成 Gymfile 模板 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/generate_gymfile_from_template
不过,你也可以通过在 inputs.template 中指定自定义模板,并在 inputs.extra 对象中提供这些自定义属性的值,来在模板中使用其他自定义属性。
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 %>")
| 属性 | 类型 | 描述 |
|---|---|---|
name | - | 在构建日志中显示的可重用函数步骤名称。默认值为 Generate Gymfile from template。 |
inputs.template | string | 可选输入,定义应使用的 Gymfile 模板。如果未指定,则会根据是否指定了 inputs.credentials 值,从两个默认模板中选择一个。 |
inputs.credentials | json | 可选输入,用于定义 iOS 构建的应用凭据。如果指定,则会向模板提供 KEYCHAIN_PATH、EXPORT_METHOD 和 PROFILES 值。 |
inputs.build_configuration | string | 可选输入,定义 Xcode 项目的 Build Configuration。默认值为 ${ eas.job.buildConfiguration },如果未指定,则对 development client 解析为 Debug,对其他构建解析为 Release。对应模板值 BUILD_CONFIGURATION。 |
inputs.scheme | string | 可选输入,定义构建时应使用的 Xcode 项目 scheme。默认值为 ${ eas.job.scheme },如果未指定,则解析为在 Xcode 项目中找到的第一个 scheme。对应模板值 SCHEME。 |
inputs.clean | boolean | 可选输入,定义构建前是否应清理 Xcode 项目。默认值为 true。对应模板变量 CLEAN。 |
inputs.extra | json | 可选输入,定义应提供给模板的额外值。 |
在 GitHub 上查看 eas/generate_gymfile_from_template 函数的源代码。
eas/run_fastlane
此函数仅适用于 iOS 构建。
在 ios 项目目录中,针对位于该目录下的 Gymfile 运行 fastlane gym 命令,以构建 iOS 应用。
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
build: name: 构建 iOS 应用 steps: - eas/checkout - eas/install_node_modules - eas/prebuild - eas/configure_eas_update - eas/generate_gymfile_from_template - eas/run_fastlane
在 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 服务器。
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
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
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
在 GitHub 上查看 eas/find_and_upload_build_artifacts 函数的源代码。
eas/upload_artifact
从提供的路径上传构建工件。
警告 你目前每个构建任务中每种工件类型只能上传一次。
如果你在构建配置中设置了buildArtifactPaths,并且使用了eas/find_and_upload_build_artifacts,而该步骤找到了并上传了一些构建工件,那么后续的任何eas/upload_artifact步骤都会失败。
为了解决这个问题,目前我们建议从自定义构建的配置中移除buildArtifactPaths,并在需要时在 YAML 中使用eas/upload_artifact手动上传工件。
例如,具有以下 steps 的构建配置会将一个工件上传到 EAS 服务器:
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
| 输入 | 类型 | 描述 |
|---|---|---|
path | string | 必填。要上传到 EAS 服务器的工件路径,或以换行分隔的路径列表。你可以使用 * 通配符和其他 glob 模式。 |
type | string | 上传到 EAS 服务器的工件类型。允许的值为 application-archive 和 build-artifact。默认值为 application-archive。 |
在 GitHub 上查看 eas/upload_artifact 函数的源代码。
eas/install_maestro
确保已安装 Maestro 以及它的所有依赖项,这是一款移动端 UI 测试框架。
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
| 输入 | 类型 | 描述 |
|---|---|---|
maestro_version | string | 要安装的 Maestro 版本(例如 1.35.0)。如果未提供,install_maestro 将安装最新版本。 |
在 GitHub 上查看 eas/install_maestro 函数的源代码。
eas/start_android_emulator
启动一个可用于测试应用的 Android 模拟器。仅在执行 Android 构建时可用。
build: name: 构建并测试 steps: - eas/build - eas/start_android_emulator: inputs: system_image_package: system-images;android-30;default;x86_64 # ... Maestro setup and tests
| 输入 | 类型 | 描述 |
|---|---|---|
device_name | string | 创建的设备名称。如果启动多个模拟器,可以自定义该名称。 |
system_image_package | string | 用于模拟器的 Android 包路径。例如 system-images;android-30;default;x86_64。要获取可用系统镜像列表,请在本地计算机上运行 sdkmanager --list。虚拟机运行在 x86_64 架构上,因此始终选择 x86_64 版本的包。sdkmanager 工具 来自 Android SDK 命令行工具。 |
在 GitHub 上查看 eas/start_android_emulator 函数的源代码。
eas/start_ios_simulator
启动一个可用于测试应用的 iOS 模拟器。仅在执行 iOS 构建时可用。
build: name: 构建并测试 steps: - eas/build - eas/start_ios_simulator # ... Maestro setup and tests
| 输入 | 类型 | 描述 |
|---|---|---|
device_identifier | string | 你想启动的模拟器名称或 UDID。示例包括 iPhone [XY] Pro、AEF997BB-222C-4379-89BA-D21070B1D787。注意: 可用的模拟器因每个镜像而异。如果更换镜像,某个名称对应的模拟器可能会变得不可用。例如,Xcode 14 镜像会有 iPhone 14 模拟器,而 Xcode 15 镜像会有 iPhone 15 模拟器。通常我们建议不要提供此输入。更多信息请参见 runner 镜像。 |
在 GitHub 上查看 eas/start_ios_simulator 函数的源代码。
eas/send_slack_message
向已配置的 Slack webhook URL 发送指定消息,然后它会将消息发布到相关的 Slack 频道中。
该消息可以指定为纯文本或 Slack Block Kit 消息。
在这两种情况下,你都可以在消息中引用构建任务属性并 使用其他步骤的输出 进行动态计算。
例如,'Build URL: ${ eas.job.expoBuildUrl }'、Build finished with status: ${ steps.run_fastlane.status_text }、Build failed with error: ${ steps.run_gradle.error_text }。
必须指定“message”或“payload”之一,但不能同时指定两者。
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
| 输入 | 类型 | 描述 |
|---|---|---|
message | string | 你要发送的消息文本。例如,'This is the content of the message'。注意: 必须提供 message 或 payload 之一,但不能同时提供两者。 |
payload | string | 使用 Slack Block Kit 布局定义的消息内容。 注意: 必须提供 message 或 payload 之一,但不能同时提供两者。 |
slack_hook_url | string | 先前配置的 Slack webhook URL,它会将你的消息发布到指定频道。你可以直接提供 URL,例如 slack_hook_url: 'https://hooks.slack.com/services/[rest_of_hook_url]',也可以使用 EAS secrets,例如 slack_hook_url: ${ eas.env.ANOTHER_SLACK_HOOK_URL },或者设置 SLACK_HOOK_URL 密钥,它将作为默认 webhook URL(在这种情况下,无需提供 slack_hook_url 输入)。 |
在 GitHub 上查看 eas/send_slack_message 函数的源代码。
使用内置 EAS 函数构建应用
使用内置 EAS 函数,你可以为不同的构建类型重建默认的 EAS Build 流程。
例如,要触发一个为 Android 创建内部分发构建、为 iOS 创建模拟器构建的任务,你可以使用以下配置:
{ %%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%% }
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
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 构建,你可以使用以下配置:
{ %%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%% }
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
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.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