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

时间:2017-05-09 00:54:59

标签: node.js npm

我正在尝试创建一个具有postinstall脚本的npm模块,该脚本将修改用户package.json并重新安装软件包。我几乎就在那里,但我遇到的问题是npm CLI过早地运行我的postinstall脚本。

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

我的意思是什么?太早"?例如,在yarn install之后,如果我的脚本干扰yarn.lockpackage.json文件将无法准确反映yarn install。但是,如果我的脚本等待yarn install完全完成然后运行另一个yarn install,则yarn.lock文件将是准确的,并且将输出更多yarn install个命令"已经向上最新"

2 个答案:

答案 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)