npm脚本:read.env文件
我有一个简单的要求:在我的npm scripts package.json文件中,我有一行:npm脚本:read.env文件,npm,npm-scripts,Npm,Npm Scripts,我有一个简单的要求:在我的npm scripts package.json文件中,我有一行: { “脚本”:{ “示例”:“某些库--参数--域\”https://tld.com\"" } } 现在我想把“域”计算出来 第一次尝试是使用$npm\u package\u config,它可以: { “配置”:{ “域”:https://tld.com" }, “脚本”:{ “示例”:“某些库--参数--域\”$npm\u包\配置\域\” } } 但我希望从本地.env文件加载域 我没有找到任何
{
“脚本”:{
“示例”:“某些库--参数--域\”https://tld.com\""
}
}
现在我想把“域”计算出来
第一次尝试是使用$npm\u package\u config
,它可以:
{
“配置”:{
“域”:https://tld.com"
},
“脚本”:{
“示例”:“某些库--参数--域\”$npm\u包\配置\域\”
}
}
但我希望从本地.env文件加载域
我没有找到任何解决方案来读取命令行上npm脚本中的env文件内容
有人能给我一个关于这个问题的可能解决方案的提示吗?简短回答:没有一种简单的方法可以跨平台实现这一点,正如您的第二个例子所示,它引用了
$npm\u package\u config
变量
对于跨平台解决方案,即在*nix和Windows平台上都能成功运行的解决方案,npm脚本使用的默认shell分别是sh
或cmd
,您需要通过nodejs帮助脚本执行您的命令(即当前在npm脚本中定义的命令)。基本上,您的nodejs脚本需要:
- 利用包加载
文件.env
- 使用nodejs内置模块执行命令;或者
解决方案 1..env文件 首先,假设项目目录的根目录中有一个.env文件。
.env
文件包含以下条目:
域=https://tld.com
2.安装
下面的nodejs脚本利用包从.env文件加载环境变量。我们需要安装它。要执行此操作,请将cd
复制到项目目录并运行以下命令:
npm i-D dotenv
3.Node.js脚本(一些lib cmd.js)
接下来创建一个nodejs脚本,如下所示。让我们将文件命名为some lib cmd.js,并将其保存在项目目录的根目录中:
//需求。。。
require('dotenv').config();
const execSync=require('child_process')。execSync;
常量路径=要求(“路径”);
/**
*在node_modules/.bin目录中创建可执行文件的路径。每个
*路径段与相应的平台特定分隔符连接,如图所示
*分隔符。
*@param{String}cmd可执行文件的名称。
*@返回{String}可执行文件的路径。
*/
函数getBinFile(cmd){
返回path.join('node_modules','.bin',cmd);
}
//执行命令。。。
execSync(`${getBinFile('some-lib')}--参数--domain${process.env.domain}`,{stdio:[0,1,2]});
注意事项:
- 如果.env文件不与some-lib-cmd.js一起位于项目目录的根目录中,则可以使用dotenv的选项定义指向
文件位置的自定义路径。例如:.env
require('dotenv').config({path:'path/to/other/folder/'))
- 为了从我们使用的nodejs脚本中引用
变量,即DOMAIN
process.env.DOMAIN
scripts
部分定义以下脚本:
“脚本”:{
“示例”:“node some lib cmd”
}
注意:如果您选择将some-lib-cmd.js保存在其他位置,即不在项目目录根目录中,则根据需要在示例
脚本中重新定义路径。例如:
“脚本”:{
“示例”:“节点路径/to/some/folder/some lib cmd”
}
一个简单得多的解决方案是使用bash在线解析env文件并提取所需的变量:
假设您的.env
文件如下所示:
有一个库完全符合您希望遵循的12factor应用程序最佳实践:npmjs.org的dotenv包 自由贸易协定:
令人惊讶的是,没有人提到“ol-trued-trued-DirEnv-to-auto-setup-environment”用于当前工作目录。这样,env对于本地计算机是私有的,并且可用于所有脚本,包括代码库中的脚本。对于默认情况下不会查看.env文件的东西,它非常方便 我在我的机器上都用这个,不仅仅是在开发中 项目 值得一看!
感谢RobC提供的详细帮助。我刚刚发布了一个关于这个问题的软件包,看看@DavidVielhuber已经做了一段时间了吗?@DavidVielhuber-你说“你能举个例子说明如何…”这是我还是阿克库马的问题?b、 t.w简单地看一下“env cmd”,它似乎没有像Akkuma建议的那样提供在npm脚本中使用变量的bulltin解决方案。抱歉,线程错误@Akkuma您能举一个例子说明env cmd如何在npm脚本中使用环境变量吗?我认为这是不可能的。
“scripts”:{“webhooks:dev rg”:“env cmd——使用shell的ts节点src/MyUtils/webhooks\u register.ts https://${dev\u RESOURCEGROUP}.azurewebsites.net”…
您见过dotenv cli吗?但是,当需要跨平台时,它就不那么酷了,因为这在非bash shell中失败了-尤其是windows cmd.exe。这对我来说很旧,但仍然很有用。只是想知道是否有任何增强功能?是否可以为env var提供默认值,以防在en中丢失它v文件或该文件不存在。我知道我可以做${DOMAIN:-mydomain}但是这个用例的语法是什么?是的,这很酷,但不能期望其他人也有它。
DOMAIN=https://tld.com
"scripts": {
"example": "some-lib --argument --domain $(grep DOMAIN .env | cut -d '=' -f2)"
}
$ node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/your/env/vars