所以我需要在通过npm安装新软件包之前阅读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
即使没有考虑我们的特定用例,我也很奇怪您无法访问package.json
和preinstall
脚本中的postinstall
。它们似乎只适用于该用例。
我正在安装的软件包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的子进程运行的,并且根目录完全不同。 < / p>
然后我认为npm root
应该跟踪实际根对我的位置,并将其作为参数从testmodule package.json中传递给我的脚本:
{
"name": "testmodule",
"version": "0.3.6",
"description": "TODO",
"scripts": {
"preinstall": "npm i some-script && some-script \"$(npm root)\"",
},
"author": "TODO",
"license": "MIT"
}
不幸的是,它也会默认返回到临时路径:
/path/to/folder/node_modules/.staging/testmodule-5cc9d333/node_modules
我向注册管理机构提交了an issue,但没有抱着我的希望及时赶到。此外,我的脚本需要在旧的npm安装上工作。
与此同时,我在some-script
:
let pgkPath = process.cwd().split('/node_modules/')[0];
这将返回/path/to/folder/
这是正确的,但它假设没有人在名为npm i
的文件夹中运行node_modules
...似乎hacky。
如何从通过预安装运行的npm脚本中访问package.json的路径?对我来说,这似乎不是太过于无法要求的东西?
答案 0 :(得分:2)
我完全不了解您的用例,而是回答您从预安装脚本中找到父package.json
的具体问题:
将$(cd .. && npm prefix)
作为参数传递给您的脚本,然后加载./package.json
。
npm prefix
将返回最近的父目录以包含package.json
文件,当从..
目录调用时,该文件应返回父npm包的路径。
{
"name": "testmodule",
"version": "0.3.6",
"description": "TODO",
"scripts": {
"preinstall": "npm i some-script && some-script \"$(cd .. && npm prefix)\"",
},
"author": "TODO",
"license": "MIT"
}