我使用 Node.js 创建了一个简单的 CLI(以及一些附带的软件包,如询问器、boxen 等),它使用
dotenv
来管理 .env
文件。
如果我从根目录运行 CLI,它可以正常工作 (
node .
)。但是,当我全局安装它时(npm i -g .),我只能在终端中以我在 package.json
文件中设置的名称运行它;它找不到 .env。
据我所知,全局安装所做的只是符号链接项目,并将别名添加到 Node.js 路径,因此我可以从终端中的任何位置运行它,但我很挣扎找到一种方法来读取
.env
,以便 CLI 能够正常运行。
我尝试过其他
.env
包(我对此了解不多,所以知道引用它的正确方法可能是我的主要问题)。
我尝试更改
dotenv.config()
以包含某种形式的路径引用,但我的构建设置为 module
构建,因此它抱怨我使用 imports 而不是 require (import * as dotenv from 'dotenv'
)正如我所说;如果我运行 node .
,则可以从根目录正常工作。
我想,由于它只是符号链接文件夹并创建别名,因此它能够毫无问题地读取
.env
文件。但我真的不知道还能尝试什么。
Index.js
#! /usr/bin/env node
import fs from 'fs'
import * as dotenv from 'dotenv'
dotenv.config()
let token = process.env.PERSONAL_TOKEN
async function loadUserOptions() {
const client = new Client({ apiKey: token })
}
此时,如果我通过 CLI 名称运行它,它将失败,因为无法找到
PERSONAL_TOKEN
,但如果我使用 node .
从它的根目录运行它,它就可以正常工作。
所以,在意识到(感谢你们可爱的人们)CLI 的
.env
是一个愚蠢的想法之后,我最终采用的解决方案是更有针对性的解决方案。我发现了一个名为 Conf 的非常可靠的包,它以非常简单的方式保存命令行数据,这使我能够从用户那里获取输入提示并存储必要的数据。
正确的解决方案(至少对我有用的解决方案)是使用Conf。
Conf
的美妙之处在于它以与 LocalStorage 类似的方式存储您要求的任何数据。该语法非常容易记住,并且非常适合我的特定用例。