NodeJS 节点程序/模块阅读自己的package.json:这可能吗?

txu3uszq  于 2023-08-04  发布在  Node.js
关注(0)|答案(2)|浏览(84)

我有一个Node CLI程序,它有一些依赖项和通过相对文件路径导入的各种模块。我希望代码能够读取自己的package.json文件,但我不知道如何在安装程序时“找到”它(也就是说,当它的包安装了npm installnpm install -g)。
阅读和解析package.json很容易- * 当从自己的源目录 * 运行它时。当然,这是真的,因为文件路径“./package.json”是有效的。
我不介意阅读文件并解析它,但我不知道有一种机制可以解析“.”-相对路径,其工作方式与

import foo from "./lib/foo.mjs";

字符串
如果node_modules/.bin的正确目录在我的PATH中,那么当程序(以及包)已经安装在系统的任何位置时,这样的导入都可以工作,而不管我当时使用的是哪个工作目录。
也许这是不可能的,但是想要加载package.json似乎并不奇怪。

vzgqcmou

vzgqcmou1#

你可以尝试解析process.argv[1],它指向执行脚本的路径(可以是带有index.js的目录名):

import fs from 'fs';
const path = process.argv[1].split('/');
let found;

while (path.length) {
    const dirname = path.join('/');
    if (fs.statSync(dirname || '/').isDirectory) {
        const filename = dirname + '/package.json';
        if (fs.existsSync(filename)) {
            found = filename;
            break;
        }

    }
    path.pop();
}

if (!found) {
    // we are silly not to found     
}

const json = JSON.parse(fs.readFileSync(found));

console.log(JSON.stringify(json));

字符串
输出量:

{"name":"package-json","version":"1.0.0","description":"","main":"index.js","type":"module","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":"","license":"ISC"}

knsnq2tg

knsnq2tg2#

这是我在野外发现的东西,它仍然让我头晕目眩,但它很有效。这基本上就是Nenashev先生的代码在他的答案中所做的,但它利用了内置工具(我不知道存在)。
第一步是从“module”模块导入createRequire()函数:

import { createRequire } from "module";

字符串
该函数返回一个类似CommonJS require()的函数,从给定的路径或文件URL作为参数开始。现在,这非常有用,但我们需要起始目录,这是我的问题的根源(Nenashev先生的答案解决了这个问题)。这就引出了第二个新工具import.meta。这是一个具有一个属性“url”的对象,该属性的值是调用它的模块的“file://”URL。
因此,有了这两件事,我可以写:

const require = createRequire(import.meta.url);

const PACKAGE = require("./package.json");


这将工作,即使(例如)我安装我的包全局和cd到任何随机目录。只要我的Node程序的启动器在我的PATH中,从我运行它的任何地方,“file://”URL将是包文件所在的真实的目录的绝对路径。
所以总结一下,得到package.json的一个非常快速的方法是:

import { createRequire } from "module";
const PACKAGE = createRequire(import.meta.url)("./package.json");


而且是同步的耶

相关问题