Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
npm脚本:read.env文件_Npm_Npm Scripts - Fatal编程技术网

npm脚本:read.env文件

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文件加载域 我没有找到任何

我有一个简单的要求:在我的npm scripts package.json文件中,我有一行:

{
“脚本”:{
“示例”:“某些库--参数--域\”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内置模块执行命令;或者
然后可以通过npm脚本调用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

4.package.json 在package.json的
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