我有一个Node CLI程序,它有一些依赖项和通过相对文件路径导入的各种模块。我希望代码能够读取自己的package.json
文件,但我不知道如何在安装程序时“找到”它(也就是说,当它的包安装了npm install
或npm install -g
)。
阅读和解析package.json
很容易- * 当从自己的源目录 * 运行它时。当然,这是真的,因为文件路径“./package.json”是有效的。
我不介意阅读文件并解析它,但我不知道有一种机制可以解析“.”-相对路径,其工作方式与
import foo from "./lib/foo.mjs";
字符串
如果node_modules/.bin
的正确目录在我的PATH中,那么当程序(以及包)已经安装在系统的任何位置时,这样的导入都可以工作,而不管我当时使用的是哪个工作目录。
也许这是不可能的,但是想要加载package.json
似乎并不奇怪。
2条答案
按热度按时间vzgqcmou1#
你可以尝试解析
process.argv[1]
,它指向执行脚本的路径(可以是带有index.js的目录名):字符串
输出量:
型
knsnq2tg2#
这是我在野外发现的东西,它仍然让我头晕目眩,但它很有效。这基本上就是Nenashev先生的代码在他的答案中所做的,但它利用了内置工具(我不知道存在)。
第一步是从“module”模块导入
createRequire()
函数:字符串
该函数返回一个类似CommonJS
require()
的函数,从给定的路径或文件URL作为参数开始。现在,这非常有用,但我们需要起始目录,这是我的问题的根源(Nenashev先生的答案解决了这个问题)。这就引出了第二个新工具import.meta
。这是一个具有一个属性“url”的对象,该属性的值是调用它的模块的“file://”URL。因此,有了这两件事,我可以写:
型
这将工作,即使(例如)我安装我的包全局和
cd
到任何随机目录。只要我的Node程序的启动器在我的PATH中,从我运行它的任何地方,“file://”URL将是包文件所在的真实的目录的绝对路径。所以总结一下,得到
package.json
的一个非常快速的方法是:型
而且是同步的耶