我正在尝试创建一个具有postinstall
脚本的npm模块,该脚本将修改用户package.json
并重新安装软件包。我几乎就在那里,但我遇到的问题是npm CLI过早地运行我的postinstall
脚本。
有没有办法,可能通过使用Node或系统级技巧,等待整个npm install
进程在我的脚本运行之前退出?就像当npm调用我的postinstall
脚本时,那时我可以注册另一个脚本在npm install
完成后运行吗?
我的意思是什么?太早"?例如,在yarn install
之后,如果我的脚本干扰yarn.lock
,package.json
文件将无法准确反映yarn install
。但是,如果我的脚本等待yarn install
完全完成然后运行另一个yarn install
,则yarn.lock
文件将是准确的,并且将输出更多yarn install
个命令"已经向上最新"
答案 0 :(得分:3)
考虑直接使用 package.json 进行篡改是不好的做法,因为Devs将不再控制他们安装的软件包,甚至是他们的项目名称。
因此,软件包应该在安装过程中请求Dev更改 package.json ,并提供一种方法来为干运行启用Devs做成。
<强> TLDR 强>;确保完全同意Dev对 package.json 的任何篡改。
这就是为什么我认为替代方法比使用安装后脚本更好的原因。我提出的最简单的解决方案:
<强> 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
。
注意:在上面的示例中,没有错误处理,没有显示文本,也没有实际写入 package.json 。它仅仅是关于如何在npm install
之后执行代码的说明。没有显示文字的原因是调用了exec
,为此调用了一个新流程&#34;个人&#34; 标准输出。或者使用fork
,可以在节点文档中找到更多信息here。
我试图通过设置来调用npm install
而不是npm run myinstall
"install": "node myinstall.js"
。但是现在exec('npm run install')
将以递归方式调用自身。
答案 1 :(得分:0)
postInstall
你发现有非常不同寻常的执行方式,并且在某些版本的npm(所有前npm 3)中都有问题,这在以后的版本中修复了所以首先要确保你的npm版本是最新;如果你有2个选项,我可以帮你解决问题,
选项1
这是最简单的解决方案,使用此脚本,它非常自我解释,它将安装所有内容,并在安全的一面给安装后一次。不是最理想的解决方案,但它应该没有问题。
#!/bin/bash
npm install
npm run postinstall
选项2
如果可能,请尝试将devDependencies
移至dependencies
,对于某些用户来说,这似乎解决了postInstall
问题。但我不推荐devDependencies
是有原因的。
<强>更新强>
好的,我现在得到了这个问题,但应该对选项1的脚本略有不同。由于您的安装后脚本已经可以处理修改和重新安装。
#!/bin/bash
npm install
cd (<path to your modue> && npm run postinstall)