我使用 Node.js 创建了自己的 CLI,它使用 .env,但是当它全局安装时我找不到它

问题描述 投票:0回答:1

我使用 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 的非常可靠的包,它以非常简单的方式保存命令行数据,这使我能够从用户那里获取输入提示并存储必要的数据。

javascript node.js command-line-interface
1个回答
0
投票

正确的解决方案(至少对我有用的解决方案)是使用Conf

Conf
的美妙之处在于它以与 LocalStorage 类似的方式存储您要求的任何数据。该语法非常容易记住,并且非常适合我的特定用例。

© www.soinside.com 2019 - 2024. All rights reserved.