在原来的“npm install”完成后运行npm`postinstall`脚本? (也许通过使用节点技巧?)
我正在尝试创build一个具有postinstall
脚本的npm模块,该脚本将修改用户的package.json
并重新安装软件包。 我快到了,但是我遇到的问题是npm CLI太早运行我的postinstall
脚本。
有没有办法,也许通过使用节点或系统级别的技巧,等待整个npm install
过程退出之前我的脚本运行? 就像npm调用我的postinstall
脚本时那样,我可以在npm install
完成后注册另一个脚本来运行?
“太早”是什么意思? 例如, yarn install
,如果我的脚本干扰yarn install
, yarn.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
尝试移动devDependencies
到dependencies
如果可能的话,对于一些用户来说,这似乎解决了postInstall
问题。 但我不推荐它devDependencies
是有原因的。
UPDATE
好的,我现在遇到了这个问题,但是应该对选项1的脚本稍加修改。 由于您的postinstall脚本已经可以处理修改和重新安装。
#!/bin/bash npm install cd (<path to your modue> && npm run postinstall)