在 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 字段。

eas.json
{ "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
  • developmentClienttrue 时,使用 development
  • 其他情况使用 preview
内置环境变量

以下环境变量是暴露给每个 job 的额外系统环境变量,可在任意构建步骤中使用。它们不属于任何项目环境,并且在本地评估 app.config.js 时不可用:

  • CI=1:表示这是一个 CI 环境
  • EAS_BUILD=true:表示这是一个 EAS Build 环境
  • EAS_BUILD_PLATFORMandroidios
  • EAS_BUILD_RUNNER:EAS Build 云构建为 eas-build本地构建local-build-plugin
  • EAS_BUILD_ID:构建 ID,例如 f51831f0-ea30-406a-8c5f-f8e1cc57d39c
  • EAS_BUILD_PROFILE:来自 eas.json 的构建配置名称,例如 production
  • EAS_BUILD_PROJECT_ID:EAS 项目 ID,例如 bd2f7e21-1ee7-47f2-8357-d7c4b50622fb
  • EAS_BUILD_GIT_COMMIT_HASH:Git 提交的哈希值,例如 88f28ab5ea39108ade978de2d0d1adeedf0ece76
  • EAS_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 命令:

Terminal
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 路由一起部署。

使用 EAS Hosting 时,只能使用纯文本敏感环境变量。秘密变量不能通过 EAS Hosting 部署。
客户端环境变量

所有在浏览器中运行的代码都属于客户端。在 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 来获取 developmentpreviewproduction 的环境变量。

在其他命令中使用环境变量

向其他 EAS 命令提供非秘密 EAS 环境变量的一种方式是使用 eas env:exec 命令。

Terminal
eas env:exec --environment production 'echo $APP_VARIANT'

例如,在更新 bundle 创建后,使用 SENTRY_AUTH_TOKEN 变量上传 source map 到 Sentry 时,这会很有用。

Terminal
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 环境。

.eas/workflows/publish-preview.yml
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 环境。

.eas/workflows/fingerprint-and-build.yml
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 结束。

Terminal
set-env EXAMPLE_ENV "example value"

访问环境变量

创建环境变量后,你可以在后续的 EAS Build jobs 中通过 Node.js 中的 process.env.VARIABLE_NAME 或 shell 脚本中的 $VARIABLE_NAME 来读取它。