我们在拿到一个项目之后,我们都会找到package.json中的script,甚至在做项目做久之后,我们也会自己写一些脚本来给开发提效。
但是如何传递一个参数给脚本?如何执行某个脚本文件呢?
介绍
NPM脚本是package.json中定义的一组内置脚本和自定义脚本,他们的目标就是提供一种简单的方法来执行重复的任务。
如:
·启动项目
·打包项目
·执行单元测试,生成测试报告之类
···
如何定义一个脚本?
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
}
值得注意:NPM中所有依赖的node_modules bin都可以在脚本中直接访问,就像在路径中被引用的都一样,也就是默认会加"./node_modules/.bin",比如:
{
"scripts": {
"lint": "./node_modules/.bin/eslinteslint .",
}
}
命令
"npm run test"和"npm test”都可以执行脚本,这是因为,有些脚本是内置可以使用更短的命名来执行的,更容易记住,
例如,下面所有的命令效果都是一样的:
npm run-script test
npm run test
npm test
执行多个脚本
我们可能想结合一些脚本并一起运行他们。为此,我们可以使用&&或&
要依次运行多个脚本,使用&&,例如:
npm run lint && npm test
要并行执行多个脚本,可以使用&,例如:
npm run lint & npm test
注意:这仅适用于Unix环境,在windows中,它将按顺序运行。
因此:在实际项目中可以直接创建一个结合了两个脚本,以此来简化我们的操作。
{
"script": {
"start": "node index.js",
"start1": "node index.js",
"test": "npm run start & npm run start1"
}
}
pre 和 post
我们可以为任何脚本创建"pre"和"post"脚本,NPM会自动按顺序运行他们。唯一的要求就是脚本的名称(后跟"pre"或"pos”前缀)与主脚本匹配。
{
"prehello": "echo \" prescript \"",
"hello": "echo \"Hello World\"",
"posthello": "echo \" postscript \""
}
如果我们执行npm run hello,npm会按顺序执行脚本"prehello","hello","posthello",输出如下:
> example@0.1.0 prehello E:\资源\example
> echo " prescript "
" prescript "
> example@0.1.0 hello E:\资源\example
> echo "Hello World"
"Hello World"
> example@0.1.0 posthello E:\资源\example
> echo " postscript "
" postscript "
错误
当脚本以非0退出码结束时,这意味着在运行脚本的时候发生了错误,并终止执行
{
"scripts": {
"test": "exit 1"
}
}
在脚本抛出错误的时候,我们会得到其他细节,比如错误号error和代码,具体的错误日志路径都可以在终端获取到。
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! example@0.1.0 demo: `exit 1`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the example@0.1.0 demo script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\Lenovo\AppData\Roaming\npm-cache\_logs\2021-04-17T06_34_59_579Z-debug.log
静默模式
如果想减少错误日志并非防止防止脚本抛出错误,可以使用下面的命令来”静默“处理,(比如在ci中,即使测试命令失败,也希望整个管道继续运行,就可以使用这个命令)
npm run <script> --silent
npm run <script> -s
从文件中引用路径
如果脚本很复杂的话,在package.json中维护明显会越来越冗长,也越来越难维护,因此复杂的脚本我们一般会写在文件中,在从文件中执行脚本,如下:
{
"hello.js": "node scripts/helloworld.js",
"hello:bash": "bash scripts/helloworld.sh",
"hello:cmd": "cd scripts && helloworld.cmd"
}
我们使用node <path.js>来执行js文件,使用bash <path.sh>来执行bash文件
值得注意的是,如果是cmd或bat文件,则需要先cd导航到对应的文件夹目录,不能像sh,js文件一样,直接执行,否则会报错
访问环境变量
在执行NPM脚本时,NPM提供了一组我们可以使用的环境变量,我们可以使用
npm_config_<val> 或者 npm_package_<val>