构建后注入变量环境
Inject variables environment after build
看看有没有人能赐教
我一直在做一些研究,我发现了一些在构建后注入的库,但这不是我想要的。
我想要的是构建项目,然后注入暂存或生产环境。所以基本上我只想构建一次,然后注入任何环境文件(暂存或生产)。
现在我在有 Dotenv 库的地方使用 webpack,如果我想使用暂存或生产环境,我必须构建两次。
这可能吗?
谢谢
您说过这是针对 server-side 代码的,并且您正在使用 dotenv
。
您不需要为生产重建。您至少可以采用以下几种方法:
使用环境变量而不是dotenv
,或
使用环境变量来控制 .env.xyz
文件 dotenv
加载什么,或者
两者都有。
我建议#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
文件中获取信息,并使用托管平台的环境功能覆盖它。但这似乎不必要地复杂。
看看有没有人能赐教
我一直在做一些研究,我发现了一些在构建后注入的库,但这不是我想要的。 我想要的是构建项目,然后注入暂存或生产环境。所以基本上我只想构建一次,然后注入任何环境文件(暂存或生产)。 现在我在有 Dotenv 库的地方使用 webpack,如果我想使用暂存或生产环境,我必须构建两次。
这可能吗?
谢谢
您说过这是针对 server-side 代码的,并且您正在使用 dotenv
。
您不需要为生产重建。您至少可以采用以下几种方法:
使用环境变量而不是
dotenv
,或使用环境变量来控制
.env.xyz
文件dotenv
加载什么,或者两者都有。
我建议#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
文件中获取信息,并使用托管平台的环境功能覆盖它。但这似乎不必要地复杂。