介绍
国际上一流的脚本自动化构建工具
使用
mkdir project
cd ./project
npm init //初始化生成一个package.json
npm install commander //加一个命令行库
package.json
{
"name": "sygame",
"bin": {
"ZM": "./bin/version.js"
},
"version": "1.0.0",
"description": "写一款自己的命令行工具",
"main": "index.js",
"scripts": {
"build": "node ./bin/index.js",
"dev": "node ./bin/index.js",
"start": "node ./bin/index.js",
"command": "node ./bin/version.js"
},
"keywords": [
"123456"
],
"author": "hzj",
"license": "ISC",
"dependencies": {
"commander": "^6.0.0"
}
}
按照上面package.json的内容
1:下面的配置是允许我们在外界
npm run build 就会去执行 node ./bin/index.js
npm run dev就会去执行 node ./bin/index.js
npm run start就会去执行 node ./bin/index.js
npm run command就会去执行 node ./bin/index.js
"scripts": {
"build": "node ./bin/index.js",
"dev": "node ./bin/index.js",
"start": "node ./bin/index.js",
"command": "node ./bin/version.js"
},
2:下面的配置是重点,就是自定义了一个命令ZM,当在控制台输入 ZM这个字符串的时候,会去执行(./bin/version.js)这个文件,相当于执行(node ./bin/version.js),当然我们还需要继续下面的步骤才可以实现
"bin": {
"ZM": "./bin/version.js"
},
在当前目录下创建一个bin文件夹,再创建一个version.js
version.js
#! /usr/bin/env node
async function init(){
console.log("init--------");
}
async function compress(){
console.log("compress--------");
}
async function package(){
console.log("package--------------");
}
var program = require('commander');
program
.version('0.0.1', '-v,--version')
//接受外部传来的参数
.arguments(' [env]' )
//对这个命令行的整体描述
.description("你好zhangxiaoman")
//这是一个命令参数,允许带多个参数
//-n 1 2 3
.option('-n, --number ' , 'specify numbers')
//这是一个命令参数,如果外界的命令参数中带有这个字符,则表示要启动
//下面这个字符对应的init函数
.option('-i, --init', 'init')
//这是一个命令参数,如果外界的命令参数中带有这个字符,则表示要启动
//下面这个字符对应的compress函数
.option('-c, --compress', 'compress')
//这是一个命令参数,如果外界的命令参数中带有这个字符,则表示要启动
//下面这个字符对应的package函数
.option('-p, --package', 'package')
//外部传来参数时会触发这个函数arguments(' [env]')
.action(function (cmd, env) {
console.log("执行action");
cmdValue = cmd;
envValue = env;
})
.parse(process.argv);
console.log('command:', cmdValue);
console.log('environment:', envValue || "no environment given");
( async()=>{
if(program.init)
{
await init();
console.log("初始化完毕");
}
if(program.compress)
{
await compress();
console.log("压缩完成");
}
if(program.package)
{
await package();
console.log("打包完成");
}
} )();
在代码的开头第一行,必须指定我们的脚本执行所需要的解释程序。在这里,我们使用node来作为脚本的解释程序。而我们#! /usr/bin/env node这样写,目的是使用env来找到node,并使用node来作为程序的解释程序
#! /usr/bin/env node
最后一步执行:
//将命令行注册到环境变量中
npm link
测试
ZM -i -n 1 2 3 -c -p cmd env
/*
执行action
command: cmd
environment: env
--------- [ '1', '2', '3' ]
init--------
初始化完毕
compress--------
压缩完成
package--------------
打包完成
*/
可能报错
执行 npm link
报错 Maximum call stack size exceeded
解决方法:删除本地的node_modules,升级npm npm install -g npm