如何创建一个cli工具呢?

573 阅读3分钟

如何创建一个cli工具呢?

1.创建文件夹以及初始化

mkdir vitim-cli && cd vitim-cli && npm init -y

2.创建bin文件夹,并设置bin命令

image-20211028143649244.png

通过设置bin命令,为后面发布到npm,可以通过vitim命令(可以看第7点)访问

3.commander插件

commander的使用

安装

yarn add commander or npm install commander

在bin目录下新建commander.js 文件

const { program } = require('commander');
program.version('0.0.1');
​
​
//有两种最常用的选项,一类是 boolean 型选项,选项无需配置参数,
//另一类选项则可以设置参数(使用尖括号声明在该选项后,如--expect <value>)。如果在命令行中不指定具体的选项及参数,则会被定义为undefined。
​
program
  .option('-d, --debug', 'output extra debugging')
  .option('-s, --small', 'small pizza size')
  .option('-p, --pizza-type <type>', 'flavour of pizza');
​
// 参数解析
program.parse(process.argv);

运行

image-20211028144326490.png 可以得知commander可以为我们进行参数解析

这里注意一个点

// 参数解析
program.parse(process.argv);

这段代码必须放在最后,不然写在它后面的会解析失败

4.inquirer插件

inquirer的使用

inquirer是什么呢?

inquirer是实现人机交互的插件

安装

yarn add inquirer or npm install inquirer

在bin目录下新建inquirer.js 文件

const { program } = require('commander');
const inquirer  = require('inquirer');
program.version('0.0.1');
​
program
  .command('create <app-name>')  // 命令
  .description('create app') // 命令描述
  .action(async () => {  // 命令行为
    let answer = await inquirer.prompt([
      {
        name: 'features',
        type: 'checkbox',
        message: 'Check the features needed for your project',
        choices: ['Babel', 'TypeScript', 'Router', 'Vuex', 'CSS Pre-processors']
      },
      {
        name: 'use_class_style',
        type: 'confirm',
        message: 'Use class-style component syntax?'
      },
    ])
​
    // 通过answer可以获取到刚才的选择
  })
​
// 参数解析
program.parse(process.argv);

运行

image-20211028145553150.png

5.download-git-repo插件

download-git-repo的使用

download-git-repo这个插件可以帮助我们从git仓库中拉取代码

安装

yarn add download-git-repo or npm install download-git-repo

在bin目录下新建download.js 文件

let download = require("download-git-repo")
// 第二个参数为拉取代码后的文件夹名字
download('direct:https://gitee.com/igxv/v-cli', 'appName', { clone: true })

运行

image-20211028150337936.png 可以看到我们拉取成功了,多了一个名字叫appName的文件夹

6.综合运用

☆目标:
1.创建一个vimit-cli工具
2.输入vimit create appName 开始进行创建
3.出现选择
   (1).请选择你的语言版本?  ['JavaScript', 'TypeScript']
   (2).请选择css预处理器? ['sass', 'less']
4.创建成功之后的提示
you can
cd appName
yarn or npm install
yarn dev or npm run start

全部代码

const { program } = require('commander');
const inquirer  = require('inquirer');
const { promisify } = require('util') // 异步
const download = promisify(require("download-git-repo"))
const chalk = require('chalk')
​
// 克隆
const clone = (appName) =>  download('direct:https://gitee.com/igxv/v-cli', appName, { clone: true })
//日志打印
const log = (content, color) => console.log(chalk[color](content));
​
program.version('1.0.0');
program
  .command('create <app-name>')  // 命令
  .description('create app') // 命令描述
  .action(async (appName) => {  // 命令行为
    let answer = await inquirer.prompt([
      {
        name: 'language',
        type: 'checkbox',
        message: '请选择你的语言版本?',
        choices: ['JavaScript', 'TypeScript']
      },
      {
        name: 'pre_css',
        type: 'checkbox',
        message: '请选择css预处理器?',
        choices: ['sass', 'less']
      },
    ])
    // 开始克隆
    clone(appName);
    log(`
    创建成功
    `, 'green')
    log(`
    you can
    cd appName
    yarn or npm install
    yarn dev or npm run start
    `,'blue')
})
​
// 参数解析
program.parse(process.argv);

运行

image-20211028152136516.png

发布到npm中

npm publish

image-20211028152331401.png

这样就可以发布成功了

7.使用

安装已经发布的vitim-cli

npm i vitim-cli -g

使用vitim进行创建

vitim create app 

8.插件推荐

交互输入: inquirerenquirerprompts

输出美化: chalkkleurinkfiglet

加载动画:ora

基本解析:meowarg

参数解析:commanderyargs

操作命令行 sindresorhus/ansi-escapes

输出截断 sindresorhus/cli-truncate