跳到主要内容

NPM的script脚本

“scripts”属性中的脚本

npm 支持运行package.json里“scripts”属性中的脚本,包括:

  • prepublish:在npm publish命令之前运行(也会在不带参数的npm install命令前运行,详情在下段描述)

  • prepare: 在两种情况前运行,一是npm publish命令前,二是不带参数的npm install命令;它会在prepublish之后、prepublishOnly之前执行

  • prepublishOnly: 在npm publish命令前执行

  • publish,postpublish: 在npm publish命令后执行

  • preinstall: 在npm install命令前执行

  • install,postinstall: 在npm install命令后执行

  • preuninstall,uninstall: 在npm uninstall命令前执行

  • postuninstall : 在npm uninstall命令后执行

  • preversion:在改变包的version前执行

  • version: 在改变包的version后,但提交之前执行

  • postversion: 在提交version变更后执行

  • pretest, test, posttest: 伴随npm test命令

  • prestop, stop, poststop: 伴随npm stop命令

  • restart, start, poststart: 伴随 npm start命令

  • pre restart, restart, poststart: 伴随 npm restart命令。提示:假如scripts里没有写restart命令,npm默认会运行start、stop

  • preshrinkwrap, shrinkwrap, postshrinkwrap: 伴随 npm shrinkwrap 命令(用于固定依赖包版本)

prepublish 和 prepare

废弃告示: 从npm@1.1.71开始,npm CLI 会在npm publish和npm install之前执行prepubish脚本,因为这做法便于准备package环境(几种用法如本段下面描述)。但事实证明这让人非常困惑。所以在npm@4.0.0后,新增来一种事件prepare来替代上述功能。另外一种新事件prepublishOnly作为替代策略,让用户避免以往npm版本的混乱行为。prepublishOnly 只在npm publish前执行(例如,publish前最后执行一次测试,以确保无误)

重要提示:在npm5中, prepublish只在npm publish前执行,即取代prepublishOnly,所以npm6即以后的版本会放弃prepublishOnly。到时就忘了这些矬事吧。

执行顺序

并行

如果是并行执行(即同时的平行执行),可以使用&符号。

npm run script1.js & npm run script2.js


"scripts": {
...,
"lint:bx": "npm run lint:js & npm run lint:jsx & npm run lint:css & npm run lint:json & npm run lint:markdown"
}

并行命令,为了稳定复现一些错误,可在命令最后加上 & wait。另外,加上 & wait 的好处还有,如果我们在子命令启动长时间运行的进程,可用 ctrl + c 来结束进程。

串行

实现方式很简单,用 && 符号按顺序把命令串联起来。

"scripts": {
...,
"lint:cx": "npm run lint:js && npm run lint:jsx && npm run lint:css && npm run lint:json && npm run lint:markdown"
}

串行命令执行过程中,如果前面的命令失败,后面命令会全部终止。所以前面的命令一般都是那种不可交换的,返回ture或者false的。示例很简单,自己试下就好。

附加参数

向 npm 脚本传入参数,要使用--标明

"lint": "jshint **.js"

向上面的npm run lint命令传入参数,必须写成下面这样。

$ npm run lint --  --reporter checkstyle > checkstyle.xml

也可以在package.json里面再封装一个命令。

"lint": "jshint **.js",
"lint:checkstyle": "npm run lint -- --reporter checkstyle > checkstyle.xml"