我有一个简单的要求:在我的npm脚本package.json文件中,有以下一行:
{
"scripts": {
"example": "some-lib --argument --domain \"https://tld.com\""
}
}
现在,我希望排除“域”。
首先尝试使用$npm_package_config
,它可以工作:
{
"config": {
"domain": "https://tld.com"
},
"scripts": {
"example": "some-lib --argument --domain \"$npm_package_config_domain\""
}
}
但是我想要从本地.env文件加载域。
我没有找到任何解决方案来读取命令行npm脚本中的env文件的内容。
有人可以给我提示解决此问题的方法吗?
答案 0 :(得分:3)
简短的答案:没有第二种方法可以实现此目的,根据第二个引用$npm_package_config
变量的示例。
相反,您需要通过nodejs帮助程序脚本执行命令(即,当前在npm-script中定义的命令)。本质上,您的nodejs脚本将需要:
.env
文件。child_process.exec()
或child_process.execSync()
。然后可以通过您的npm-script调用nodejs帮助脚本。
下面介绍如何实现跨平台运行的解决方案。
首先,假设我们在项目目录的根目录中有一个 .env 文件。 .env
文件包含以下条目:
DOMAIN=https://tld.com
以下nodejs脚本利用dotenv包从 .env 文件加载环境变量。我们需要安装它。为此,cd
到您的项目目录并运行以下命令:
npm i -D dotenv
接下来,如下创建一个nodejs脚本。我们将文件命名为 some-lib-cmd.js ,并将其保存在项目目录的根目录中:
// Requirements...
require('dotenv').config();
const execSync = require('child_process').execSync;
const path = require("path");
/**
* Creates a path to an executable in the node_modules/.bin directory. Each
* path segment is joined with the appropriate platform-specific separator as
* a delimiter.
* @param {String} cmd The name of the executable.
* @returns {String} The path to the executable.
*/
function getBinFile(cmd) {
return path.join('node_modules', '.bin', cmd);
}
// Execute the command...
execSync(`${getBinFile('some-lib')} --argument --domain ${process.env.DOMAIN}`, { stdio: [0, 1, 2] });
注释:
如果您的 .env 文件与 some-lib-cmd.js 不在我们项目目录的根目录中,则可以使用< em> dotenv的 path
选项来定义.env
文件位置的自定义路径。例如:
require('dotenv').config({ path: 'path/to/another/folder/' })
要在nodejs脚本中引用DOMAIN
变量,我们使用process.env
,即process.env.DOMAIN
。
在 package.json 的scripts
部分中,定义以下脚本:
"scripts": {
"example": "node some-lib-cmd"
}
注意:如果您选择将 some-lib-cmd.js 保存在其他位置,即不在项目目录根目录中,请重新定义路径根据需要在example
脚本中输入。例如:
"scripts": {
"example": "node path/to/some/folder/some-lib-cmd"
}
答案 1 :(得分:1)
一个更简单的解决方案是仅使用bash内联解析env文件并提取所需的变量:
假设您的.env
文件如下所示:
DOMAIN=https://tld.com
"scripts": {
"example": "some-lib --argument --domain $(grep DOMAIN .env | cut -d '=' -f2)"
}
答案 2 :(得分:0)
有一个库可以完全满足您遵循12factor应用最佳实践的要求:npmjs.org的dotenv软件包
https://www.npmjs.com/package/dotenv
FTA:
$ node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/your/env/vars
答案 3 :(得分:0)
令人惊讶的是,没有人提到'ol试用过的真正的DirEnv来自动设置当前工作目录的环境。这样,env对本地计算机是私有的,并且可用于所有脚本(包括代码库内部)。对于默认情况下不会查看.env文件的内容,它很有用。
不仅在开发中,我还在整个机器上使用它 项目。
值得一试的国防部! Direnv