我正在尝试创建一个npm模块,它具有一个postinstall脚本,可以修改用户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命令将输出"已经是最新的".
小智 5
考虑直接篡改package.json是不好的做法,因为开发人员将不再控制他们已安装的包,甚至他们的项目名称。
因此,包应该请求开发人员在安装过程中更改 package.json ,并提供一种方法使开发人员能够对将要进行的更改进行试运行。
太长了;确保完全同意开发人员对 package.json 的任何篡改。
这就是为什么我认为替代方法比使用安装后脚本更好的原因。我想出的最小解决方案:
myinstall.js
const exec = require('child_process').exec;
exec('npm run install').on('exit', () => exec('npm run mypostinstall'));
Run Code Online (Sandbox Code Playgroud)
包.json
"scripts": {
"myinstall": "node myinstall.js",
"mypostinstall": "echo \"myPostinstall called\""
},
Run Code Online (Sandbox Code Playgroud)
将mypostinstall脚本设置为等于postinstall.
注意:在上面的示例中,没有错误处理,没有显示文本,也没有实际写入package.json。它纯粹是为了说明如何在之后执行代码npm install。没有显示文本的原因是由于调用exec,因此使用其“个人” stdout调用了一个新进程。或者使用,可以在节点文档中fork找到更多信息。
我尝试调用npm install而不是npm run myinstall通过设置
"install": "node myinstall.js"。然而现在exec('npm run install')将递归地调用自身。