我有一个简单的要求:在我的npm脚本package.json文件中,有以下一行:
{
"scripts": {
"example": "some-lib --argument --domain \"https://tld.com\""
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想排除“域”。
首先尝试使用$npm_package_config
,它可以工作:
{
"config": {
"domain": "https://tld.com"
},
"scripts": {
"example": "some-lib --argument --domain \"$npm_package_config_domain\""
}
}
Run Code Online (Sandbox Code Playgroud)
但我想从本地.env文件加载域。
我没有找到任何解决方案来在命令行上的npm脚本中读取env文件的内容。
有人可以给我提示解决此问题的方法吗?
L.M*_*L.M 21
假设您有一个.env
这样的文件:
DOMAIN="https://tld.com"
Run Code Online (Sandbox Code Playgroud)
然后,您可以source
在命令中使用,如下所示:
{
// ...
"scripts": {
"example": "source .env && some-lib --argument --domain $DOMAIN"
}
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,这在 Windows 中不起作用,但如果您安装了 Git Bash,那么您可以配置 npm 以使用它来运行命令,例如(从此处):
npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"
Run Code Online (Sandbox Code Playgroud)
一个更简单的解决方案是仅使用 bash 内联解析 env 文件并提取所需的变量:
假设您的.env
文件如下所示:
DOMAIN=https://tld.com
Run Code Online (Sandbox Code Playgroud)
"scripts": {
"example": "some-lib --argument --domain $(grep DOMAIN .env | cut -d '=' -f2)"
}
Run Code Online (Sandbox Code Playgroud)
有一个库可以完全满足您想要遵循的 12factor 应用程序最佳实践:来自 npmjs.org 的 dotenv 包
https://www.npmjs.com/package/dotenv
自由贸易协定:
$ node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/your/env/vars
Run Code Online (Sandbox Code Playgroud)
简短的回答:按照第二个引用该$npm_package_config
变量的示例,没有简单的方法可以实现跨平台工作。
对于跨平台的解决方案,即在* nix和Windows平台上都可以成功运行的解决方案-npm脚本使用的默认shell是sh
或cmd
分别是,则需要执行命令(即,当前在Windows中定义的命令)。您的npm脚本)通过nodejs帮助脚本。本质上,您的nodejs脚本将需要:
.env
文件。child_process.exec()
或child_process.execSync()
。然后可以通过您的npm-script调用nodejs帮助脚本。
下面介绍如何实现跨平台运行的解决方案。
首先,假设我们在项目目录的根目录中有一个.env文件。该.env
文件包含以下条目:
DOMAIN=https://tld.com
Run Code Online (Sandbox Code Playgroud)
以下nodejs脚本利用dotenv包从.env文件中加载环境变量。我们需要安装它。为此,请cd
在您的项目目录中运行以下命令:
npm i -D dotenv
Run Code Online (Sandbox Code Playgroud)
接下来,如下创建一个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] });
Run Code Online (Sandbox Code Playgroud)
笔记:
如果您的.env文件不与some-lib-cmd.js一起位于我们项目目录的根目录中,则可以利用dotenv的 path
选项来定义.env
文件位置的自定义路径。例如:
require('dotenv').config({ path: 'path/to/another/folder/' })
Run Code Online (Sandbox Code Playgroud)为了DOMAIN
从nodejs脚本中引用变量,我们利用process.env
,即process.env.DOMAIN
。
在package.json的scripts
部分中,定义以下脚本:
"scripts": {
"example": "node some-lib-cmd"
}
Run Code Online (Sandbox Code Playgroud)
注意:如果您选择将some-lib-cmd.js保存在其他位置,即不在项目目录的根目录中,请example
根据需要在脚本中重新定义路径。例如:
"scripts": {
"example": "node path/to/some/folder/some-lib-cmd"
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3710 次 |
最近记录: |