构建后注入变量环境

Inject variables environment after build

看看有没有人能赐教

我一直在做一些研究,我发现了一些在构建后注入的库,但这不是我想要的。 我想要的是构建项目,然后注入暂存或生产环境。所以基本上我只想构建一次,然后注入任何环境文件(暂存或生产)。 现在我在有 Dotenv 库的地方使用 webpack,如果我想使用暂存或生产环境,我必须构建两次。

这可能吗? 谢谢

您说过这是针对 server-side 代码的,并且您正在使用 dotenv

您不需要为生产重建。您至少可以采用以下几种方法:

  1. 使用环境变量而不是dotenv,或

  2. 使用环境变量来控制 .env.xyz 文件 dotenv 加载什么,或者

  3. 两者都有。

我建议#1。

1。使用环境变量(不带dotenv

您可以只使用环境变量而不使用 dotenv。 (这就是我的大部分项目的完成方式。)dotenv 引用了 Twelve-Factor App 指南,同时鼓励您打破它们 - 通过拥有一个 .env 文件,这是一个配置文件。指南不赞成使用配置文件获取环境信息;来自 link:

The twelve-factor app stores config in environment variables (often shortened to env vars or env). Env vars are easy to change between deploys without changing any code; unlike config files, there is little chance of them being checked into the code repo accidentally...

(我并不是说 Twelve-Factor 应用指南是福音,只是在鼓励使用配置文件的同时引用它们似乎很奇怪。)我 认为 dotenv 的想法是您永远不会将 .env 检查到源代码管理中,而是在每个环境的根目录中手动创建它。但这不是我在野外使用它的方式。

因此,您可以按照这些指南的建议代替 dotenv:使用环境变量。您的托管平台将提供一种方法来为您的代码 运行 所在的环境设置环境变量。这些变量将在 process.env 上可用,不需要 dotenv.

这是一个简单的例子:

index.js:

console.log(process.env.EXAMPLE);

如果您 运行 在具有 EXAMPLE 环境变量的环境中,您将在控制台中看到该变量的值。因此,您使用托管平台的功能来设置环境变量,一切就绪。

(如果你只想在本地尝试一下,你可以在 *nix 上这样做:

$ EXAMPLE=hi node index.js
hi

...或者在 Windows 上这样:

C:\Temp> cmd /C "set EXAMPLE=hi && node index.js"
hi

...但是不要因此产生错误的印象。您不在命令行设置环境变量,而是以您的托管平台允许的任何方式设置它们。)

2。使用环境变量(with dotenv

如果您想使用 dotenv 并拥有配置文件,您可以使用环境变量来控制加载的配置文件。 (这就是我参与的几个项目的完成方式。)

您可以设置一个环境变量来告诉您的代码它 运行 所在的环境(开发、暂存、生产等),然后用它来告诉 dotenv 什么 .env.xyz 文件加载。 create-react-app 使 NODE_ENV 流行起来,例如,将 NODE_ENV=DEV 用于开发,将 NODE_ENV=PROD 用于生产。您可以使用它来控制 dotenv,告诉它使用 .env.PROD 进行生产,但(比如).env.DEV 用于开发或 .env.STAGING 用于暂存等

import path from "path";
import dotenv from "dotenv";

const env = process.env.NODE_ENV ?? "DEV";
dotenv.config({
    path: path.resolve(process.cwd(), `.env.${env}`),
});

3。两者

您可以组合使用上述方法。 dotenv 不会覆盖 process.env 中已经存在的内容(因为它是在环境中设置的)。因此,您可以在 .env 文件中获取信息,并使用托管平台的环境功能覆盖它。但这似乎不必要地复杂。