NPM scripts使用

npm脚本功能是最常用的功能之一。npm runnpm run-script 的缩写。运行 npm run <script_name>会执行当前项目的package.jsonscripts 属性下的这段脚本。

简单使用

使用scripts字段定义脚本命令。

1
2
3
"scripts": {
"build": "node build.js"
}

使用npm run命令,就可以执行这段脚本:

1
npm run build

原理

npm run 会创建一个Shell,执行指定的命令,并临时将node_modules/.bin加入PATH变量,执行结束后,再将PATH变量恢复原样。
这意味着当前目录的node_modules/.bin子目录里面的脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写mocha test就可以了。

1
2
3
"test": "mocha test"
//而不用写成下面这样。
"test": "./node_modules/.bin/mocha test"

npm 脚本的退出码,也遵守 Shell 脚本规则。如果退出码不是0,npm就认为这个脚本执行失败。

传参

npm 脚本传入参数,要使用--隔开,-- 后面的内容都会原封不动地传给运行的命令。

1
"test": "mocha test"

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

1
$ npm test -- --reporter spec

也可以封装在package.json里面。

1
"test": "mocha --reporter spec"

钩子

npm script 中有两个钩子prepost。例如上面的test脚本:

1
2
3
4
5
"scripts":{
"pretest": "echo run before the test script"
"test": "mocha --reporter spec",
"posttest": "echo run after the test script"
}

执行npm test的时候,会自动按照下面的顺序执行。

1
npm run pretest && npm run test && npm run posttest

简写形式

四个常用的 npm 脚本有简写形式。

  • npm start是npm run start
  • npm stop是npm run stop的简写
  • npm test是npm run test的简写
  • npm restart

npm restart是一个复合命令,它不单单执行prerestart, restart, postrestart具体的执行顺序如下:

  1. prerestart
  2. prestop
  3. stop
  4. poststop
  5. restart
  6. prestart
  7. start
  8. poststart
  9. postrestart

环境变量

npm 脚本可以访问package.json中的变量。
通过 process.env.npm_package_xxx 可以获得,比如,下面是一个package.json。

1
2
3
4
5
6
7
8
9
10
11
{
"name": "foo",
"version": "1.2.5",
"scripts": {
"view": "node view.js"
}
}

process.env.npm_package_name // foo
process.env.npm_package_version // 1.2.5
process.env.npm_package_scripts_view //node view.js

npm脚本可以访问npm的配置变量。
通过 process.env.npm_config_xxx 可以获得,即npm config get xxx命令返回的值。
例如process.env.npm_config_user_email可以拿到user.email 的值。