介绍
环境变量允许您在本地开发、测试、登台、用户验收测试 (UAT)、生产和作为项目工作流程一部分的任何其他环境之间切换。
不是将变量单独传递到脚本中,而是env-cmd
让您将变量分组到环境文件 ( .env
) 中并将它们传递到脚本。
在本文中,您将env-cmd
在一个示例项目中安装和使用。
先决条件
要完成本教程,您需要:
- Node.js 安装在本地,您可以按照如何安装 Node.js 和创建本地开发环境来完成。
- 有一个关于将文件添加到
.gitignore
. 如果您希望遵循,这可能需要安装和配置git
。 - 熟悉终端窗口和代码编辑器也将大有裨益。
注意:本教程已更新为使用env-cmd
9.0.0 版本之后的命令。
本教程已通过 Node v15.14.0、npm
v7.10.0 和env-cmd
v10.0.1 验证。
步骤 1 – 设置项目
本教程假设您有一个新项目。创建一个新目录:
- mkdir env-cmd-example
然后导航到目录:
- cd env-cmd-example
将环境文件提交到版本控制系统通常被认为是一种不好的做法。如果存储库被分叉或共享,则其他人可以使用这些凭据,因为它们将永远记录在项目历史中。
建议将文件添加到您的.gitignore
.
注意:这对于本教程的范围来说不是必需的,而是出于教育目的在此处提供。
初始化一个新git
项目:
- git init
创建一个.gitignore
文件并添加模式以排除您的环境文件:
.env
.env.js
.env.json
.env-cmdrc
对于本教程,您可以排除.env
、.env.js
、.env.json
、.env-cmdrc
。
然后,.env
为项目创建一个文件。
在代码编辑器中打开文件并添加以下代码行:
creature=shark
green=#008f68
yellow=#fae042
这定义了creature
to shark
、green
to #008f68
、yellow
to #fae042
。
然后,创建一个新log.js
文件:
console.log('NODE_ENV:', process.env.NODE_ENV);
console.log('Creature:', process.env.creature);
console.log('Green:', process.env.green);
console.log('Yellow:', process.env.yellow);
这会将先前定义的变量记录到控制台。它还会打印出NODE_ENV
值。
现在,您的示例已准备好将环境文件与env-cmd
.
第 2 步 – 使用 env-cmd
现代npm
并且yarn
可以在env-cmd
不使其成为依赖项的情况下运行。
使用任一npx:
- npx env-cmd node log.js
或者yarn run
:
- yarn run env-cmd node log.js
否则,您可以将软件包安装为依赖项或 devDependency:
- npm install env-cmd@10.0.1
该env-cmd
软件包安装了一个名为的可执行脚本env-cmd
,该脚本可以在您的脚本之前调用,以轻松地从外部文件加载环境变量。
根据您的设置,您可以env-cmd
通过几种不同的方式进行引用。
也许最兼容的包管理器是向您的package.json
文件添加自定义脚本:
{
"scripts": {
"print-log": "env-cmd node log.js"
}
}
例如,使用npm
,您将能够使用以下命令运行此自定义脚本:
- npm run print-log
如果你更喜欢env-cmd
直接从命令行使用,你可以直接从node_modules
:
- ./node_modules/.bin/env-cmd node log.js
展望未来,本教程将使用该npx
方法,但所有方法都旨在以类似方式工作。
现在,在您的终端中使用其中一种方法。
无论您选择如何运行脚本,env-cmd
都将加载.env
文件,并且日志记录脚本将报告变量。
OutputNODE_ENV: undefined
Creature: shark
Green: #008f68
Yellow: #fae042
您可能已经注意到该NODE_ENV
值为undefined
。那是因为NODE_ENV
没有在.env
文件中定义。
可以NODE_ENV
在调用之前传入env-cmd
。
例如,这是以下命令npx
:
- NODE_ENV=development npx env-cmd node log.js
使用NODE_ENV
定义的再次运行命令:
OutputNODE_ENV: development
Creature: shark
Green: #008f68
Yellow: #fae042
在这一点上,你已经学会了使用env-cmd
与.env
文件。
步骤 3 – 使用不同的文件格式
env-cmd
默认情况下需要.env
项目根目录中的文件。但是,您可以使用--file
( -f
) 选项更改文件类型和路径。
无论您如何引用它,您都可以使用多种文件格式来存储环境变量。
JSON 文件
下面是一个.env.json
文件示例:
{
"creature": "shark",
"green": "#008f68",
"yellow": "#fae042"
}
这是使用此文件的示例env-cmd
:
- NODE_ENV=development npx env-cmd --file .env.json node log.js
现在您已经学习了如何使用 JSON 环境文件。
JavaScript
下面是一个.env.js
文件示例:
module.exports = {
creature: 'shark',
green: '#008f68',
yellow: '#fae042'
};
这是使用此文件的示例env-cmd
:
- NODE_ENV=development npx env-cmd --file .env.js node log.js
现在您已经学习了如何使用 JavaScript 环境文件。
RC文件
该rc
文件格式是特殊的,因为它可以让你在一个JSON文件中定义多个环境,并通过名称而不是文件中引用的环境。
“runcom”文件也很特殊,因为它必须被命名.env-cmdrc
并存在于项目的根目录中。
下面是一个的例子.env-cmdrc
文件与定义的环境development
,staging
和production
:
{
"development": {
"NODE_ENV": "development",
"creature": "shark",
"green": "#008f68",
"yellow": "#fae042",
"otherVar1": 1
},
"staging": {
"NODE_ENV": "staging",
"creature": "whale",
"green": "#6db65b",
"yellow": "#efbb35",
"otherVar2": 2
},
"production": {
"NODE_ENV": "production",
"creature": "octopus",
"green": "#4aae9b",
"yellow": "#dfa612",
"otherVar3": 3
}
}
使用这些.env-cmdrc
值需要一个--environments
( -e
) 选项。
然后您可以引用单个环境:
- npx env-cmd --environments development node log.js
您甚至可以引用多个环境,这些环境会将每个环境变量合并在一起,如果存在重叠变量,则最后一个环境优先:
- npx env-cmd --environments development,staging,production node log.js
通过指定我们的所有三个环境,otherVar
将设置每个值,其余变量来自列出的最终环境,production
。
第 4 步 – 使用优雅回退 --fallback
在不存在自定义环境文件的情况下:
npx env-cmd -f .env.missing node log.js
env-cmd
会抛出错误:
OutputError: Failed to find .env file at path: .env.missing
在自定义 env 文件路径出现意外问题的情况下,env-cmd
可以尝试.env
从项目的根目录加载文件。为此,请传入--fallback
标志:
- npx env-cmd --file .env.missing --fallback node log.js
现在,如果有一个有效的.env
文件可以回退,这个命令将不会显示任何错误。
步骤 5 – 使用现有环境值 --no-override
在某些情况下,您可能希望保留已在环境中设置的全部或部分变量。
要尊重,而不是在你的使用值现有的环境变量.env
文件,传递env-cmd
的--no-override
标志:
- NODE_ENV=development creature=squid npx env-cmd --no-override node log.js
这将导致以下输出:
OutputNODE_ENV: development
Creature: squid
Green: #008f68
Yellow: #fae042
请注意,该creature
值已设置为squid
代替文件shark
中定义的which .env
。
结论
在本文中,您安装并env-cmd
在一个示例项目中使用。
使用环境文件可以帮助您在“开发”和“生产”环境之间切换。