dotenv process.env 变量在全局安装的自定义 CLI 工具中未定义

dotenv process.env variable undefined in globally installed custom CLI tool

我正在将我的一个 CLI 工具迁移到全局安装,以便它可以全局安装并在我的系统上的任何地方使用。我的大多数 src 文件的顶部都包含 require('dotenv').config(),但由于某些原因 env 未定义,因为它已安装到全局。

我错过了什么?

我的包 JSON 看起来像:

{
  "name": "scoop",
  "version": "1.9.0",
  "main": "bin/scoop.js",
  "dependencies": {
    "axios": "0.20.0",
    "cli-spinners": "2.4.0",
    "commander": "6.1.0",
    "dotenv": "8.2.0",
    "log-symbols": "4.0.0",
    "ora": "5.1.0",
    "readline": "1.3.0"
  },
  "bin": {
    "scoop": "./bin/scoop.js"
  }
}

bin/scoop.js 然后在顶部包含以下内容:

#!/usr/bin/env node

require('dotenv').config();
const forms = require('../src/utils/LocateForms');
...

我正在加载其他导出的 JS src 文件,我的项目中有一个 .env 我的自定义变量现在刚刚出现未定义?

我认为这是预期的行为。

根据 GitHub readme.

dotenv 的默认 path 值为 Default: path.resolve(process.cwd(), '.env')

现在 process.cwd 根据执行可执行文件的位置而变化。 例如,如果您从 node /a/b/c.js 开始,则 cwd 将为 /a/b,如果您从 node /a/b/d/c.js 开始,则 cwd 将为 /a/b/d.

因此,为了获得您想要的 .env 文件,您必须像大多数其他可执行文件一样将 .env 文件存储在 ~/.yourenv 的公共区域(想想 .bashrc).

或者,您可以尝试获取安装文件夹并使用绝对路径获取.env文件。

例如你可以尝试导入npm并获取prefix来找出安装文件夹。

var npm = require("npm")
npm.load({}, function (er) {
    if (er) return handleError(er)
    console.log(npm.get('prefix'));
})

或者,您可以使用像 https://www.npmjs.com/package/get-installed-path

这样的包