使用npm中的commander的创建一套自定义命令行工具

介绍
国际上一流的脚本自动化构建工具
使用

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

你可能感兴趣的:(npm,commander)