为什么首先阅读package.json?
我正在使用npm用于CSS组件,这些组件是单独版本化的并且可以具有相互依赖性. (没有提供javascript)
寻找一堆依赖项的版本冲突,我需要检测当包A需要包C@1.0.0而包B需要包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" }
在我运行的某个脚本包里面:
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的根目录,因为我的脚本是由npm的子进程运行的,并且具有完全不同的根.
然后我想npm root应该跟踪实际root对我的位置,并将其作为参数从testmodule package.json中传递给我的脚本:
{ "name": "testmodule","scripts": { "preinstall": "npm i some-script && some-script \"$(npm root)\"","license": "MIT" }
不幸的是,它也默认返回到临时路径:
/path/to/folder/node_modules/.staging/testmodule-5cc9d333/node_modules
我在an issue提交了注册表,但没有抱着我的希望及时赶到.此外,我的脚本需要在旧的npm安装上工作.
与此同时,我在我的脚本中提出了类似的东西:
let pgkPath = process.cwd().split('/node_modules/')[0];
这将返回/ path / to / folder /这是正确的,但它假设没有人在一个名为node_modules的文件夹中运行npm i …似乎hacky.
题
如何从通过预安装运行的npm脚本中访问package.json的路径?对我来说,这似乎不是太过于无法要求的东西?
解决方法
将$(cd ..&& npm prefix)作为参数传递给脚本,然后加载./package.json.
npm prefix
将返回最近的父目录以包含package.json文件,该文件在从…目录调用时应返回父npm包的路径.
{ "name": "testmodule","scripts": { "preinstall": "npm i some-script && some-script \"$(cd .. && npm prefix)\"","license": "MIT" }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。