从预安装中运行的npm脚本中查找package.json文件

所以我需要在通过npm安装一个新包之前阅读package.json

为什么要首先阅读package.json?

我正在使用npm的CSS组件,这是单独版本,可以有相互依赖。 (没有JavaScript被交付)

寻找一堆依赖关系的版本冲突我需要检测package A需要package C@1.0.0package B需要package C@2.0.0并处理它。

Npm(从版本3开始)通过在树内嵌套更深的冲突模块来处理这些问题。 你现在结束了同一个模块的两个版本。 CSS有一个全局的命名空间和一个mixin(在Sasss的情况下)然后会覆盖对方,打破你的CSS。

这个平面依赖性问题在npm博客中有详细介绍: http : //blog.npmjs.org/post/101775448305/npm-and-front-end-packaging

即使没有考虑到我们的具体用例,我也觉得奇怪的是,在preinstallpostinstall脚本中无法访问package.json 。 他们似乎只是为了那个用例。

我试过了

我正在安装的包的package.json如下所示:

 { "name": "testmodule", "version": "0.3.6", "description": "TODO", "scripts": { "preinstall": "npm i some-script && some-script", }, "author": "TODO", "license": "MIT" } 

里面,我运行some-script包:

 console.log( process.cwd() ); console.log( __dirname ); 

然后我运行:

 ~/path/to/folder $ npm i testmodule 

这将导致:

 $ npm i testmodule > testmodule@0.3.6 preinstall /path/to/folder/node_modules/.staging/testmodule-5cc9d333 > some-script /path/to/folder/node_modules/.staging/test-module-5cc9d333 /path/to/folder/node_modules/.staging/test-module-5cc9d333/node_modules/some-script 

现在我完全明白,我无法真正访问npm i所在的根目录,因为我的脚本是由一个npm的subprocess运行的,并且具有完全不同的根目录。

然后我认为npm root应该跟踪实际根目录的位置,并从testmodule package.json中将其作为parameter passing给我的脚本:

 { "name": "testmodule", "version": "0.3.6", "description": "TODO", "scripts": { "preinstall": "npm i some-script && some-script \"$(npm root)\"", }, "author": "TODO", "license": "MIT" } 

不幸的是,也默认回到分段path:

 /path/to/folder/node_modules/.staging/testmodule-5cc9d333/node_modules 

我向注册pipe理机构提出了一个问题 ,但并没有抱着我的希望,让他们及时了解。 另外我的脚本需要工作在较旧的npm安装。

与此同时,在我some-script里面,我提出了类似的东西:

 let pgkPath = process.cwd().split('/node_modules/')[0]; 

这将返回/path/to/folder/这是正确的,但它使得假设没有人运行一个名为node_modules偶然命名的文件夹内的一个npm i …似乎hacky。

我如何从预安装的npm脚本中访问package.json的path? 对我来说,这似乎不是太离谱的要求?

我完全不理解你的用例,但是要回答你从一个预安装脚本中find父类package.json具体问题:

$(cd .. && npm prefix)作为parameter passing给脚本,然后加载./package.json

npm prefix将返回最接近的父目录来包含一个package.json文件,当从..目录中调用时,应该返回父npm包的path。

 { "name": "testmodule", "version": "0.3.6", "description": "TODO", "scripts": { "preinstall": "npm i some-script && some-script \"$(cd .. && npm prefix)\"", }, "author": "TODO", "license": "MIT" }