在 EAS 中使用环境变量
编辑页面
了解如何在 EAS 构建、更新、托管和工作流作业中使用环境变量。
For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.
以下章节介绍如何在 EAS builds、updates 和 workflow jobs 中使用环境变量。
在 EAS Build 中使用环境变量
为了完全控制构建所使用的环境,你可以在 eas.json 文件中的 build profiles 设置里指定 environment 字段。
{ "build": { "development": { "environment": "development" %%placeholder-start%%... %%placeholder-end%% }, "preview": { "environment": "preview" %%placeholder-start%%... %%placeholder-end%% }, "production": { "environment": "production" %%placeholder-start%%... %%placeholder-end%% }, "my-profile": { "environment": "production" %%placeholder-start%%... %%placeholder-end%% } } }
所选环境中的所有环境变量都会在构建过程中使用。基于 EAS CLI 中动态 app config 的构建配置解析时,也可以使用纯文本和敏感变量。
如果你没有设置 environment 选项,我们会根据你的构建配置自动设置环境:
- 当
distribution设置为store时,使用production - 当
developmentClient为true时,使用development - 其他情况使用
preview
内置环境变量
以下环境变量是暴露给每个 job 的额外系统环境变量,可在任意构建步骤中使用。它们不属于任何项目环境,并且在本地评估 app.config.js 时不可用:
CI=1:表示这是一个 CI 环境EAS_BUILD=true:表示这是一个 EAS Build 环境EAS_BUILD_PLATFORM:android或iosEAS_BUILD_RUNNER:EAS Build 云构建为eas-build,本地构建为local-build-pluginEAS_BUILD_ID:构建 ID,例如f51831f0-ea30-406a-8c5f-f8e1cc57d39cEAS_BUILD_PROFILE:来自 eas.json 的构建配置名称,例如productionEAS_BUILD_PROJECT_ID:EAS 项目 ID,例如bd2f7e21-1ee7-47f2-8357-d7c4b50622fbEAS_BUILD_GIT_COMMIT_HASH:Git 提交的哈希值,例如88f28ab5ea39108ade978de2d0d1adeedf0ece76EAS_BUILD_NPM_CACHE_URL:npm 缓存的 URL(了解更多)EAS_BUILD_MAVEN_CACHE_URL:Maven 缓存的 URL(了解更多)EAS_BUILD_COCOAPODS_CACHE_URL:CocoaPods 缓存的 URL(了解更多)EAS_BUILD_USERNAME:发起构建的用户用户名(bot 用户时未定义)EAS_BUILD_WORKINGDIR:包含你项目的远程目录路径EAS_BUILD_DISABLE_BUNDLE_JAVASCRIPT_STEP:设为1可跳过较早的 JavaScript 打包检查。默认情况下,EAS Build 会在原生构建之前先运行 JavaScript 打包器,以便更早暴露 JS 错误。禁用此步骤意味着 JavaScript 错误要到原生构建步骤才会被捕获。
秘密类型的环境变量在 EAS CLI 中进行构建配置解析时不可用,因为它们无法在 EAS 服务器之外读取。
在 EAS Update 中使用环境变量
在 SDK 55 或更高版本 中,运行 eas update 时必须使用 --environment 标志。指定的 EAS 环境中的环境变量会在更新过程中使用。对于使用 SDK 54 或更早版本的项目,如果省略 --environment 标志,eas update 会回退到本地的 .env 文件。
要在 EAS Update 中使用 EAS 环境变量,请使用 --environment 标志运行 eas update 命令:
- eas update --environment production当使用 --environment 标志时,更新过程中只会使用指定 EAS 环境中的环境变量,不会使用项目中存在的 .env 文件。这样可以确保你的更新和构建使用相同的环境变量。
Expo CLI 会将代码中的带前缀变量(例如 process.env.EXPO_PUBLIC_VARNAME)替换为由 --environment 标志指定环境下 EAS 服务器上设置的相应纯文本和敏感环境变量值。无论在本地机器还是在 CI/CD 服务器上,你应用代码中的任何 EXPO_PUBLIC_ 变量都会被内联替换为对应的 EAS 环境值。
--environment 标志确保更新和构建 job 使用相同的环境变量。
秘密变量在更新过程中不可用,因为它们无法在 EAS 服务器之外读取。
在 EAS Hosting 中使用环境变量
Expo Router Web 项目可以包含同时用于客户端和服务端的环境变量。客户端值会在运行 npx expo export 时内联到 JavaScript bundle 中,而服务端值会保存在服务器上,并在运行 eas deploy 时与 API 路由一起部署。
客户端环境变量
所有在浏览器中运行的代码都属于客户端。在 Expo Router 项目中,这包括所有不是 API Route 或 server function 的代码。客户端代码中的环境变量会在构建时内联。你绝不应该在客户端代码中放置任何敏感信息,这就是为什么所有客户端环境变量都必须以 EXPO_PUBLIC_ 为前缀。
当你运行 npx expo export 时,所有 process.env.EXPO_PUBLIC_* 环境变量实例都会被替换为环境中的值。
服务端环境变量
你所有 API routes 中的代码(以 +api.ts 结尾的文件)都会在服务器上运行。由于在服务器上运行的代码对应用用户不可见,你可以安全地使用诸如 API key 和 token 之类的敏感环境变量。
服务端环境变量不会被内联到代码中,而是在你运行 eas deploy 命令时随着部署一起上传。
存储环境变量
当使用 EAS 环境变量部署项目时,请注意客户端和服务端代码的环境变量会在不同步骤中包含:
- 运行
npx expo export --platform web会将前端代码中的EXPO_PUBLIC_变量内联。因此,在运行npx expo export命令之前,请确保你的 .env.local 文件包含正确的环境变量。 eas deploy --environment production会将给定环境(此处为production)的所有变量包含到 API routes 中。使用--environment标志加载的 EAS 环境变量会优先于 .env 和 .env.local 文件中定义的变量。
环境变量是按部署生效的,且部署是不可变的。这意味着在更改环境变量之后,你需要重新导出项目并重新部署,才能让这些更改生效。
本地开发
对于本地开发,客户端和服务端环境变量都从本地 .env 文件中加载,这些文件应被加入 gitignore。如果你正在使用 EAS 环境变量,请使用 eas env:pull 来获取 development、preview 或 production 的环境变量。
在其他命令中使用环境变量
向其他 EAS 命令提供非秘密 EAS 环境变量的一种方式是使用 eas env:exec 命令。
- eas env:exec --environment production 'echo $APP_VARIANT'例如,在更新 bundle 创建后,使用 SENTRY_AUTH_TOKEN 变量上传 source map 到 Sentry 时,这会很有用。
- eas env:exec --environment production 'npx sentry-expo-upload-sourcemaps dist'在 EAS Workflows 中使用环境变量
为 workflow jobs 设置 EAS 环境
- Build jobs:环境来自 eas.json 中的 build profile(
build.<profile>.environment)。如果该字段缺失,则适用上面描述的自动默认值。在 EAS Build 中使用环境变量。 - 其他 jobs(例如 update、submit、fingerprint、Maestro 和自定义 jobs):设置
jobs.<job_id>.environment。如果省略它,则使用production。显式设置它有助于让 job 与你在 workflow 中前面使用的 build profile 保持一致。
在下面的示例中,build job 配置为使用 preview profile,然后 update job 配置为使用相同的 EAS 环境。
name: Publish preview build and update jobs: build_preview: type: build params: platform: ios profile: preview # 使用来自 eas.json 的 build.preview.environment 的环境 publish_preview_update: needs: [build_preview] type: update environment: preview # 从 preview 环境中拉取变量 params: branch: preview
在下面的示例中,fingerprint job 配置为使用 production 环境,然后 build job 配置为使用相同的 EAS 环境。
name: Fingerprint and build jobs: fingerprint: type: fingerprint environment: production # 默认为 production,但显式设置以与 build 匹配 build_ios: needs: [fingerprint] type: build params: platform: ios profile: production # 使用来自 eas.json 的 build.production.environment 的环境
请将 job 的环境值与 build profile 保持一致,以避免 secret 不匹配。例如,fingerprint/update jobs 通常应与 build 的 profile 环境保持一致。
在 job 执行期间动态设置环境变量
你还可以在 job 执行期间使用 set-env 命令动态设置环境变量。
set-env 可执行文件在 EAS Build workers 的 PATH 中可用,可用于设置在后续构建阶段可见的环境变量。
例如,你可以在某个 EAS Build hooks 中添加以下内容,环境变量 EXAMPLE_ENV 将一直可用到构建 job 结束。
- set-env EXAMPLE_ENV "example value"访问环境变量
创建环境变量后,你可以在后续的 EAS Build jobs 中通过 Node.js 中的 process.env.VARIABLE_NAME 或 shell 脚本中的 $VARIABLE_NAME 来读取它。