从预安装中运行的npm脚本中查找package.json文件
所以我需要在通过npm安装一个新包之前阅读package.json
。
为什么要首先阅读package.json?
我正在使用npm的CSS组件,这是单独版本,可以有相互依赖。 (没有JavaScript被交付)
寻找一堆依赖关系的版本冲突我需要检测package A
需要package C@1.0.0
, package B
需要package C@2.0.0
并处理它。
Npm(从版本3开始)通过在树内嵌套更深的冲突模块来处理这些问题。 你现在结束了同一个模块的两个版本。 CSS有一个全局的命名空间和一个mixin(在Sasss的情况下)然后会覆盖对方,打破你的CSS。
这个平面依赖性问题在npm博客中有详细介绍: http : //blog.npmjs.org/post/101775448305/npm-and-front-end-packaging
即使没有考虑到我们的具体用例,我也觉得奇怪的是,在preinstall
和postinstall
脚本中无法访问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" }