介绍
环境变量允许您在本地开发、测试、阶段化、用户接受性测试(UAT)、生产和任何其他环境之间切换,这些环境是项目工作流的一部分。
而不是单独将变量传输到脚本中,env-cmd
允许您将变量组合到环境文件中(.env
)并将其传输到脚本中。
在本文中,您将在示例项目中安装和使用env-cmd
。
前提条件
要完成本教程,您将需要:
- Node.js 是本地安装的,您可以按照 如何安装 Node.js 和创建本地开发环境进行操作。 *有关于将文件添加到.gitignore 的可选部分。
<$>[注]
**注:**本教程已更新以使用版本 9.0.0 之后的 env-cmd
命令。
本教程已通过 Node v15.14.0、npm v7.10.0 和 env-cmd v10.0.1 进行验证。
步骤1 - 设置项目
此教程假设你有一个新的项目. 创建一个新的目录:
1mkdir env-cmd-example
然后导航到目录:
1cd env-cmd-example
将环境文件委托到版本控制系统通常被认为是错误的做法. 如果存储库被篡改或共享,其凭据将可用于其他人,因为它们将永远记录在项目历史中。
建议您将文件添加到您的 .gitignore
中。
<$>[注] 注: 这不需要本教程的范围,但是为教育目的在这里呈现的。
启动一个新的git
项目:
1git init
创建一个.gitignore 文件,并添加模式以排除您的环境文件:
1[label .gitignore]
2.env
3.env.js
4.env.json
5.env-cmdrc
对于本教程,您可以排除 .env
, .env.js
, .env.json
, .env-cmdrc
<$>
然后,为该项目创建一个.env 文件。
在代码编辑器中打开文件并添加以下代码行:
1[label .env]
2creature=shark
3green=#008f68
4yellow=#fae042
这将生物
定义为鲨鱼
,绿色
定义为#008f68
,黄色
定义为#fae042
。
然后,创建一个新的log.js
文件:
1[label log.js]
2console.log('NODE_ENV:', process.env.NODE_ENV);
3console.log('Creature:', process.env.creature);
4console.log('Green:', process.env.green);
5console.log('Yellow:', process.env.yellow);
这将将先前定义的变量登录到控制台,并打印出 NODE_ENV
值。
现在,您的示例已准备好使用env-cmd
的环境文件。
步骤 2 – 使用env-cmd
现代npm
和yarn
可以运行env-cmd
,而不会使其成为依赖。
或者使用 npx:
1npx env-cmd node log.js
《Yarn Run》:
1yarn run env-cmd node log.js
否则,您可以将包安装为依赖或 devDependency:
1npm install [email protected]
env-cmd
包安装了一个名为env-cmd
的可执行脚本,可以在你的脚本之前调用,以便轻松从外部文件中加载环境变量。
根据您的设置,您可以以几种不同的方式引用env-cmd
。
也许在整个包管理器中最兼容的是将自定义脚本添加到您的 package.json
文件:
1[label package.json]
2{
3 "scripts": {
4 "print-log": "env-cmd node log.js"
5 }
6}
例如,在npm
中,您将能够使用以下命令运行此自定义脚本:
1npm run print-log
如果您更喜欢直接从命令行使用env-cmd
,则可以直接从node_modules
调用它:
1./node_modules/.bin/env-cmd node log.js
未来,本教程将使用npx
方法,但所有方法都旨在以类似的方式工作。
现在,使用您的终端中的方法之一。
无论您选择如何运行脚本, env-cmd
都会加载 .env
文件,而日志脚本将报告变量。
1[secondary_label Output]
2NODE_ENV: undefined
3Creature: shark
4Green: #008f68
5Yellow: #fae042
您可能已经注意到 NODE_ENV
值为 未定义
,这是因为 NODE_ENV
在 .env
文件中没有定义。
在调用env-cmd
之前,可以输入NODE_ENV
。
例如,以下是「npx」的命令:
1NODE_ENV=development npx env-cmd node log.js
再次运行命令,定义为NODE_ENV
:
1[secondary_label Output]
2NODE_ENV: development
3Creature: shark
4Green: #008f68
5Yellow: #fae042
在这一点上,你已经学会了使用env-cmd
与.env
文件。
步骤 3 – 使用不同的文件格式
env-cmd
默认情况下预期在项目根目录中有 .env
文件. 但是,您可以使用 --file
(`-f') 选项更改文件类型和路径。
无论您如何参考它,您都可以使用各种不同的文件格式来存储环境变量。
JSON 檔案
以下是.env.json 文件的例子:
1[label .env.json]
2{
3 "creature": "shark",
4 "green": "#008f68",
5 "yellow": "#fae042"
6}
以下是使用这个文件与env-cmd
的例子:
1NODE_ENV=development npx env-cmd --file .env.json node log.js
现在你已经学会了如何使用JSON环境文件。
加密货币
以下是.env.js 文件的例子:
1[label .env.js]
2module.exports = {
3 creature: 'shark',
4 green: '#008f68',
5 yellow: '#fae042'
6};
以下是使用这个文件与env-cmd
的例子:
1NODE_ENV=development npx env-cmd --file .env.js node log.js
现在你已经学会了如何使用JavaScript环境文件。
RC 檔案
rc
文件格式是特殊的,因为它允许您在单个JSON文件中定义多个环境,并以名称而不是文件引用环境。
runcom
文件也是特别的,因为它必须被命名为.env-cmdrc
,并存在于项目的根部。
以下是一個「.env-cmdrc」檔案的例子,其環境定義為「開發」、「階段化」和「生產」:
1[label .env-cmdrc]
2{
3 "development": {
4 "NODE_ENV": "development",
5 "creature": "shark",
6 "green": "#008f68",
7 "yellow": "#fae042",
8 "otherVar1": 1
9 },
10 "staging": {
11 "NODE_ENV": "staging",
12 "creature": "whale",
13 "green": "#6db65b",
14 "yellow": "#efbb35",
15 "otherVar2": 2
16 },
17 "production": {
18 "NODE_ENV": "production",
19 "creature": "octopus",
20 "green": "#4aae9b",
21 "yellow": "#dfa612",
22 "otherVar3": 3
23 }
24}
使用 .env-cmdrc
值将需要一个 --environments
(`-e') 选项。
然后你可以参考一个单一的环境:
1npx env-cmd --environments development node log.js
您甚至可以引用多个环境,这些环境中的每个变量将合并在一起,如果有重叠变量,最后一个环境将占优势:
1npx env-cmd --environments development,staging,production node log.js
通过指定我们三个环境,每个其他Var
值将被设置,其余的变量将源自列出的最终环境生产
。
步骤 4 – 使用--fallback
的礼貌倒退
在不存在自定义环境文件的情况下:
1npx env-cmd -f .env.missing node log.js
将引发一个错误:
1[secondary_label Output]
2Error: Failed to find .env file at path: .env.missing
在与自定义 env 文件路径出现意外问题的情况下,‘env-cmd’可以尝试从项目的根部加载一个 `.env’ 文件。
1npx env-cmd --file .env.missing --fallback node log.js
现在,如果有一个有效的 .env
文件,该命令不会显示任何错误。
步骤5 – 使用现有环境价值与无过度
有些情况下,您可能希望保留已在环境中设置的所有或部分变量。
若要尊重现有的环境变量,而不是使用您的 .env
文件中的值,请通过 env-cmd
的 --no-override
旗帜:
1NODE_ENV=development creature=squid npx env-cmd --no-override node log.js
这将导致以下产出:
1[secondary_label Output]
2NODE_ENV: development
3Creature: squid
4Green: #008f68
5Yellow: #fae042
请注意,生物
值已设置为squid
,而不是鲨鱼
,这是在.env 文件中定义的。
结论
在本文中,您在一个示例项目中安装并使用env-cmd
。
使用环境文件可以帮助您在开发
和生产
环境之间切换。