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

M.K*_*afi 18 node.js npm

我正在尝试创建一个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')将递归地调用自身。

  • 谢谢@jervtub,但我希望它能够与普通的“npm install”或“yarn install”一起使用。我不想要求用户运行替代命令。我处理递归调用的方法是执行 `myInstall=attempted npm install` ,当 `myInstall` 环境变量存在时,我不会递归调用 `npm install`。如果我们对您的解决方案执行类似的操作,我们可以制作一个在用户启动的普通“npm install”完全完成后运行的脚本吗? (2认同)
  • 我不想手动调用脚本。就像我说的,当用户在他们的应用程序上安装我的包时,我希望脚本在“npm install”命令完成时自动运行。 (2认同)
  • @MKSafi 你会惊讶地发现这仍然是一个问题,但没有解决方案。你是怎么做到的? (2认同)