npm-run-script

概要

npm run-script <command> [--silent] [-- <args>...]

alias: npm run

描述

npm run-script < command >可执行package.json的script中定义的脚本命令。若不加command参数,它将列出所有可用的脚本命令。脚本命令分为生命周期(test, start, restart等)和自定义的脚本。

"scripts":{
  "start" : "echo start begin",
  "myscript": "echo helloworld"    
}

> npm run start

# 自定义的脚本命令
> npm run myscript

运行附带参数的 scripts

您可以在执行脚本时使用自定义参数。自定义参数需要放到 -- 后面,这表示会告诉 npm ,在此之后的任何东西都应该直接附加到命令中。

"scripts":{
  "test" : "npm profile get" 
}

> npm run test -- --json  # --json就是自定义参数

如上这种写法等价于:

"scripts":{
  "test" : "npm profile get --json" 
}

> npm run test

串行或并行运行多个命令

串行:一个接一个执行,用";"号分隔。

"build": "babel; jest"

并行:同时执行,用"&"号分隔。

"lint": "eslint & csslint & htmllint"

它会工作很好,但是这种方法有一个相当大的问题。 &语法会创建一个子进程,这会导致无法判断原始的 npm 进程是否已经完成。这可能是有问题的,特别是长时间运行 scripts 时。

为了使事情更加一致,我们可以使用一个名为 npm-run-all 的包。它提供了额外的命令,更具体地说就是,用 run-s 来运行串联任务, 用 run-p 来运行并行任务,它将正确处理所有的子进程。

串行:

"build": "run-s babel jest"

并行:

"lint": "run-p eslint csslint htmllint"

使用 HOOK SCRIPTS(钩子脚本)

npm 中的每条 script 在引擎内部都会运行三个单独的 script 。一个 pre scripts,一个 scripts 本身和一个 post scripts。

这两个额外运行的 scripts ,正如他们的名字所描述的那样,就是在该 scripts 运行前和该 scripts 运行后运行的脚本。

例如,在部署期间,它们可用来做一些设置和清理。

这两个 scripts 使用与之前 scripts 名称相同的 pre[scriptname] 和 post[scriptname] 来表示。

假设我们要构建我们的项目,这将是一个非常简单的例子,只是为了展示这个概念。

我们会做的是这样的:

  • 创建一个新的一个 dist 目录,如果这个目录已经存在,那么从中删除所有内容
  • 创建 tmp 目录
  • 将项目构建到 tmp 目录
  • 将我们的包压缩到到 dist 目录
  • 删除 tmp 目录
scripts:{
  "prebuild": "mkdir dist tmp; rm -rf dist/*",
  "build": "browserify main.js -o tmp/bundle.js && uglifyjs -o dist/bundle.min.js --  tmp/bundle.js",
  "postbuild": "rm -rf tmp"
}

现在,每当运行 npm run build 时,它会触发所有命令,并且保证他们以正确的顺序被执行。

运行命令组

并行&运行很方便,但是有时候灵活度不够。

我们以前的例子看起来像这样:

"lint": "eslint & csslint & htmllint"

我们可以做的是将他们分隔成单独的脚本命令,然后将他们组合一起执行:

"lint": "npm run lint:js & npm run lint:css & npm run lint:html",
"lint:js": "eslint --some-flag",
"lint:css": "csslint --that-will-change",
"lint:html": "htmllint --how-things-work"

在这个更改之后,它将以同样的方式工作,但是现在我们可以同时运行它们,或者在需要的时候也可以分别单独运行。

为了使其更加清洁,我们可以再次使用 npm-run-all ,并将我们的主要 lint 命令更改为 npm-run-all lint:* ,然后它将匹配 lint: 分组中的所有 scripts 。

依赖项中的包作为命令不需要添加路径

比较特别的是,若< commond >是依赖项中设置的包,则会将包链接到./node_modules/.bin/。会将node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。

这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写mocha test就可以了。

"test": "mocha test"

而不用写成下面这样。

"test": "./node_modules/.bin/mocha test"

其他资料: npm run-script

results matching ""

    No results matching ""