如何在 Azure 中托管的 React 应用程序中使用环境变量

IT技术 reactjs azure azure-devops
2021-04-19 13:22:44

我对 React 还很陌生,也对 Azure 进行了总体探索。我有 ERP 背景,但该背景确实包括使用 VSTS 和 CI/CD 等工具。我非常依赖使用 VSTS 中的“库”来指定每个环境的变量,然后在部署时指定这些变量。

但!我一直在互联网上阅读并使用设置,但据我所知,我只能在 NPM 生成的实际代码中“嵌入”参数。这基本上意味着我需要为每个环境创建一个单独的构建,这是我不习惯的。我一直坚信(并告诉其他人)您运送到生产中的东西应该与预生产或分期或......的东西完全相同。真的没有其他方法可以使用环境变量吗?我想在 Azure 应用服务中使用应用程序设置,但我什至无法让它们在控制台中弹出。VSTS 中的库也没有找到如何在我的部署中使用这些库,因为只有一个步骤。

阅读https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-custom-environment-variables的文档并没有让我觉得舒适地将 .env 文件放在源代码管理中。我什至尝试将 {process.env.NODE_ENV} 放在我的代码中的方法,但在 Azure 中它只显示为“开发”,而我什至执行 npm run build (应该是生产)...

所以,我在这里有点失落!如何在我的 React 应用程序中使用 Azure 应用服务中指定的环境变量?

谢谢!

6个回答

好的选择

我也遇到了这个问题,您可以通过为您的 env 使用不同的构建脚本来自定义使用哪些 env 变量。找到这个 CRA 文档 https://create-react-app.dev/docs/deployment/#customizing-environment-variables-for-arbitrary-build-environments

您还可以在 YAML 中设置变量。https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#set-variables-in-pipeline

但是如果我需要单个构建怎么办?

如果您对不同的环境(开发、暂存、生产)使用单个构建和发布阶段,我还没有解决这个问题。由于一切都已构建,React 具有您在构建时提供的任何环境变量。我考虑过的替代方案:

  1. 将 react 构建与 .NET 构建分开,以便您可以为每个部署执行此操作
  2. 定义所有环境变量并附加例如 REACT_APP_SOME_KEY_ 然后基于子域选择特定的环境,例如https://dev.yoursite.com https://yoursite.com,但此选项似乎不规范。
  3. 可能是 React 需要为每个环境构建的一个限制。接受您需要单独的构建。

当你使用 VSTS 部署到 Azure 时,你可以在构建管道中提供你的环境变量,它会自动将它包含在 ReactJS 项目中。 在此处输入图片说明

直接添加venerable来构建管道变量。这将添加到 Azure 环境变量,应用程序可以使用它 在此处输入图片说明

然而并不是。如果您的基础结构包含在尚未创建的环境的 ARM 模板中,该怎么办?因此,在发布版本运行之前,您不会知道 REACT_APP_API_URL 的值是多少。您可以手动尝试使构建和发布管道和变量保持同步,但这会破坏基础设施即代码的对象。
2021-06-01 13:22:44
@ddieppa 我认为它需要是 process.env.REACT_APP_CLIENT_ID
2021-06-04 13:22:44
@ddieppa,你能解决这个问题吗?
2021-06-05 13:22:44
我确实创建了这些变量,但仍然存在process.env.CLIENT_ID,例如在我的情况下,当管道完成并部署时,仍然收到客户端 ID 不存在的错误,是否有任何额外的步骤使其工作?
2021-06-08 13:22:44
就这么简单
2021-06-15 13:22:44

现在是 2019 年底,我仍然面临 nodeJs 和 azure devops 中 env 变量的问题。

我没有找到解决方案,但我使用了一种解决方法。我使用伪“env var”。

我创建的"env.json"文件与".env"项目根目录中的文件具有相同的结构将此文件放入".gitignore"文件。将此文件明确导入到我需要使用 env var 的文件中。将其用作常规对象,而不是 process.env.***

例子:

我们有“.env”,我们需要替换它:

REACT_APP_SOMW_KEY=KEY

项目本身的下一步是:

创建"env.json"

{"REACT_APP_SOMW_KEY":"KEY"}

将其添加到".gitignore".

如果使用typescript,请将下一个设置添加到tsconfig.json

 "resolveJsonModule": true,

在文件process.env.REACT_APP_SOMW_KEY所在的变化process.env.REACT_APP_SOMW_KEY,以config.REACT_APP_SOMW_KEY和ADDconst config = require("../pathTo/env.json")作为begginning一个导入module。

在typescript的情况下,你也可以创建界面来自动完成:

export interface IEnvConfig{
  REACT_APP_SOMW_KEY?: string;
}   
const config: IEnvConfig = require("../pathTo/env.json");

结果将是这样的:

const reactSomeKey = /*process.env.REACT_APP_SOMW_KEY*/ config.REACT_APP_SOMW_KEY;

后续步骤Azure DevOps

将您的密钥添加到 azure"key vault""variables".

在构建项目的步骤之前的 CI 管道中,您可以设置PowerShell任务,这将创建"env.json"文件。与我们应该在本地创建“.env”文件相同,因为我们使用隐藏".env"文件制作了 git clone 我把 yml 任务放在这里(最后你可以看到 2 个调试命令,以确保该文件已创建并存在于项目中):

- powershell: |
   New-Item -Path $(System.DefaultWorkingDirectory) -Name "env.json" -Force -Value @'
   {
   "REACT_APP_SOMW_KEY": "$(REACT_APP_SOMW_KEY)",
   }
   '@
   Get-Content -Path $(System.DefaultWorkingDirectory)\env.json
   Get-ChildItem -Path $(System.DefaultWorkingDirectory)
  displayName: 'Create "env.json" file'

结果:您使用 json 对象键的流程与您通常使用的".env". 您也可以在项目中同时拥有".env""env.json"

对于 Azure DevOps 部署,我做了几乎完全相同的事情。但是,我正在从存储容器中的静态网站提供我的应用程序。我改变了这个所以我生成了一个 config.js 文件并将它放在 webroot 中。在这个文件中,我在窗口上创建了一个对象,如下所示: window.appSettings = { x: "asdf",... } 然后我可以从我的代码库中的其他部分引用它。它似乎至少解决了我不必重建我的应用程序来为不同环境部署它的问题。
2021-06-19 13:22:44

所有提议的解决方案都太复杂了,因为其他人已经在打包和构建过程中解决了这个问题。

要将其部署到 azure,必须完成两件事。首先删除排除 .env* 文件的 .ignore 规则。注意:假设你没有把秘密放在这里!无论如何,.env 文件中的大部分配置在身份验证流程中都是在线可见的。那么,为什么要对 git 中的这个文件感到恐慌?特别是在私人 Git 中,我看不到那些 .env 文件有任何问题。

所以,我有 .env.dev 和 .env.prod ......这包含例如

REACT_APP_AUTH_URL=https://auth.myid4.info
REACT_APP_ISSUER=https://auth.myid4.info
REACT_APP_IDENTITY_CLIENT_ID=myclientid
REACT_APP_REDIRECT_URL=https://myapp.info/signin-oidc
REACT_APP_AUDIENCE=
REACT_APP_SCOPE=openid profile email roles mysuperapi
REACT_APP_SILENT_REDIRECT_URL=https://myapp.info/silent-renew
REACT_APP_LOGOFF_REDIRECT_URL=https://myapp.info/logout
API_URL=/

必须做到以下几点。npm i --save-dev env-cmd

现在,像这样在 package.json 中修改。您可能还有其他一些,但本质上,只为您的环境添加正确的 .env

env-cmd -f .env.prod

所以在我的情况下在 package.json

"start": "env-cmd -f .env.dev rimraf ./build && react-scripts start",
"build": "env-cmd -f .env.prod react-scripts build"

现在,我将我的 React JS 部署到 azure。我使用,仅供参考,.NET Core Spa 功能。