npm脚本:读取.env文件

时间:2019-01-01 20:18:01

标签: npm npm-scripts

我有一个简单的要求:在我的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文件的内容。

有人可以给我提示解决此问题的方法吗?

4 个答案:

答案 0 :(得分:3)

简短的答案:没有第二种方法可以实现此目的,根据第二个引用$npm_package_config变量的示例。

相反,您需要通过nodejs帮助程序脚本执行命令(即,当前在npm-script中定义的命令)。本质上,您的nodejs脚本将需要:

然后可以通过您的npm-script调用nodejs帮助脚本。

下面介绍如何实现跨平台运行的解决方案。


解决方案

1。 .env文件

首先,假设我们在项目目录的根目录中有一个 .env 文件。 .env文件包含以下条目:

DOMAIN=https://tld.com

2。安装

以下nodejs脚本利用dotenv包从 .env 文件加载环境变量。我们需要安装它。为此,cd到您的项目目录并运行以下命令:

npm i -D dotenv

3。 Node.js脚本( some-lib-cmd.js

接下来,如下创建一个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

4。 package.json

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