在原来的“npm install”完成后运行npm`postinstall`脚本? (也许通过使用节点技巧?)

我正在尝试创build一个具有postinstall脚本的npm模块,该脚本将修改用户的package.json并重新安装软件包。 我快到了,但是我遇到的问题是npm CLI太早运行我的postinstall脚本。

有没有办法,也许通过使用节点或系统级别的技巧,等待整个npm install过程退出之前我的脚本运行? 就像npm调用我的postinstall脚本时那样,我可以在npm install完成后注册另一个脚本来运行?

“太早”是什么意思? 例如, yarn install ,如果我的脚本干扰yarn installyarn.lock文件将不能准确反映package.json 。 但是,如果我的脚本等待yarn install完成,然后运行另一个yarn install ,则yarn.lock文件将是准确的,并且进一步的yarn install命令将输出“已经最新”。

考虑直接使用package.json作为坏习惯,因为Devs将不再控制他们安装的软件包,甚至他们的项目名称。

因此,软件包应该要求开发人员在安装过程中更改package.json ,并提供一种方法来启用Devs,以便对将要进行的更改进行干预。

TLDR ; 请务必完全同意Dev对package.json的任何磨练。

这就是为什么我认为替代方法比使用后安装脚本更好。 我提出的最小的解决scheme是:

myinstall.js

 const exec = require('child_process').exec; exec('npm run install').on('exit', () => exec('npm run mypostinstall')); 

的package.json

 "scripts": { "myinstall": "node myinstall.js", "mypostinstall": "echo \"myPostinstall called\"" }, 

mypostinstall脚本设置为等于postinstall

注意:在上面的例子中,没有error handling,没有文本显示,也没有实际写入package.json 。 关于如何在npm install之后执行代码的说明是纯粹的。 没有文字显示的原因是由于调用exec ,为此用一个“个人” stdout调用一个新的进程。 或者使用fork ,更多信息可以在这里find节点文档。

我试图通过设置"install": "node myinstall.js"来调用npm install而不是npm run myinstall "install": "node myinstall.js" 。 但是现在exec('npm run install')会recursion地调用它自己。

postInstall因为你已经发现有非常不同寻常的执行方式,并在某些版本的npm(所有pre-npm 3)中被窃听,这在更新的版本中是固定的所以首先确保你的npm版本是最新的; 如果你有两个select,我可以把你从我的头顶,

选项1

这是最简单的解决scheme,使用这个脚本,它是可以自我解释的,它会安装所有的东西,并在安全的一边给安装一次。 不是最理想的解决scheme,但应该没有问题。

 #!/bin/bash npm install npm run postinstall 

选项2

尝试移动devDependenciesdependencies如果可能的话,对于一些用户来说,这似乎解决了postInstall问题。 但我不推荐它devDependencies是有原因的。

UPDATE

好的,我现在遇到了这个问题,但是应该对选项1的脚本稍加修改。 由于您的postinstall脚本已经可以处理修改和重新安装。

 #!/bin/bash npm install cd (<path to your modue> && npm run postinstall)