node.js – 从在preinstall上运行的npm脚本中查找package.json文件

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

为什么首先阅读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的路径?对我来说,这似乎不是太过于无法要求的东西?

解决方法

我完全不了解您的用例,而是回答您从预安装脚本中查找父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 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于nodejs...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs怎么实现目录不存在自动创建”文章能帮助大...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs如何实现定时删除文件”文章能帮助大家解决疑惑...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
本篇内容主要讲解“怎么安装Node.js的旧版本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎...
这篇“node中的Express框架怎么安装使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要介绍“nodejs如何实现搜索引擎”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs如何实现搜索引擎...
这篇文章主要介绍“nodejs中间层如何设置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs中间层如何设置”文...
这篇文章主要介绍“nodejs多线程怎么实现”,在日常操作中,相信很多人在nodejs多线程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
这篇文章主要讲解了“nodejs怎么分布式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs怎么分布式”...
本篇内容介绍了“nodejs字符串怎么转换为数组”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
这篇文章主要介绍了nodejs如何运行在php服务器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs如何运行在php服务器文章都...
本篇内容主要讲解“nodejs单线程如何处理事件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“nodejs单线程如何...
这篇文章主要介绍“nodejs怎么安装ws模块”,在日常操作中,相信很多人在nodejs怎么安装ws模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
本篇内容介绍了“怎么打包nodejs代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!
本文小编为大家详细介绍“nodejs接收到的汉字乱码怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs接收到的汉字乱码怎么解决”文章能帮助大家解...
这篇“nodejs怎么同步删除文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇...
今天小编给大家分享一下nodejs怎么设置淘宝镜像的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希