所以我需要阅读package.json
在通过 npm 安装新包之前。
为什么首先要读取 package.json ?
我将 npm 用于单独版本控制并且可以具有相互依赖关系的 CSS 组件。(没有提供 JavaScript)
寻找一堆依赖项的版本冲突,我需要检测何时package A
需要package [email protected]
and package B
需要package [email protected]
并处理它。
Npm(从版本 3 开始)通过在树的更深处嵌套冲突的模块来处理这些问题。您现在最终获得了同一模块的两个版本。 CSS 有一个全局命名空间和一个 mixin(在 Sass 的情况下)会互相覆盖并破坏你的 CSS。
npm 博客中完美地概述了这种平面依赖问题:http://blog.npmjs.org/post/101775448305/npm-and-front-end-packaging
即使不考虑我们的具体用例,我也觉得很奇怪,您无权访问package.json
in preinstall
and postinstall
脚本。它们似乎只是针对该用例。
我尝试过的
My 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
> [email protected] 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 的子进程运行的,并且具有完全不同的根。
我然后想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
I filed an issue与注册表,但我不抱希望他们能及时完成。另外,我的脚本需要在较旧的 npm 安装上运行。
与此同时,我在我的内心想出了类似的东西some-script
:
let pgkPath = process.cwd().split('/node_modules/')[0];
那将会返回/path/to/folder/
这是正确的,但它假设没有人运行npm i
在一个顺便命名的文件夹中node_modules
...看起来很老套。
Question
如何从通过预安装运行的 npm 脚本内部访问 package.json 的路径?对我来说,这似乎是一个不太离谱的要求?