如何開發一個簡單交互式命令行工具

在這裏插入圖片描述

本文主要來實現實現一個從gitlab拉取項目模板的可交互命令行工具,旨在讓大家來理解開發一個交互式命令行工具的整個流程。

創建項目

首先當然是npm init node-cli-demo -y 直接創建出一個空白項目,之後修改package.json文件,之後創建src和bin文件夾,之後目錄結構如下圖所示:
在這裏插入圖片描述

npm init node-cli-demo -y

package.json

"scripts": {
    "convert": "babel src --out-dir ./bin/"
 },
 "bin": {
    "tm": "./bin/index.js"
 },

index.js文件初始化如下:

#!/usr/bin/env node
console.log('Hello node-cli')

之後我們直接在命令行輸入tm就會看到控制檯出現console語句了,如果提示不存在的話,可以先用npm link來綁定,之後再輸入tm即可。
這樣一個最基礎的架子就完成了,現在我們來解釋下初始化代碼的作用:#!/usr/bin/env node是通知當前系統要用node來解析當前腳本的意思。

處理命令行參數

當初始化架構搭好之後,我們就需要開始處理輸入的命令參數了,這裏我們用到的是commander:(https://github.com/tj/commander.js/)

首先安裝:

The complete solution for node.js command-line interfaces, inspired by Ruby's commander.

npm i -- save commander

然後我們就在index.js裏開始使用commander了:

const program = require('commander')

// 實現命令行工具的help描述
program
    .version(require('../package').version)
    .description('a test commander program to achieve the goal of cloning template from gitLab')
    .option('-i --init', 'init template')

// 具體開發某個命令的行爲方法    
program
    .command('init')
    .action((dir, cmd) => {
        console.log('dir, cmd', dir, cmd)
    })

// commander 執行
program.parse(process.argv)

如上我們就實現了對命令行參數的處理

處理交互式命令

在可以接收到用戶的命令參數之後,我們就開始處理內部邏輯,即需要用戶選擇下載哪個模板,這裏我們就會用到inquirer(https://github.com/SBoudrias/Inquirer.js/)

首先還是安裝:

npm i --save commander

之後修改index.js來實現交互式操作的邏輯:

const inquirer = require('inquirer')

const templates = [
    {name: 'template-1', value: {url: 'https://template-1', branch: 'master'}},
    {name: 'template-2', value: {url: 'https://template-2', branch: 'dev'}}
]

program
    .command('init')
    .action(async (dir, cmd) => {
        const res = await inquirer.prompt([{
            type: 'list',
            name: 'template',
            message: 'please check template',
            choices: () => {
                return templates
            },
            default: templates[0],
        }])
        console.log('res: ', res)
        const {url, branch} = res.template
        await cloneTemplate(url, branch)
        console.log('clone success !!!')
    })

在這裏插入圖片描述

node操作Git下載

最後我們來用下載git上的代碼,clone到本地,這裏我們需要用到的是simple-git

首先還是安裝:

npm i --save simple-git

之後使用當前包的API來clone代碼到本地目錄,如下:

const simpleGit = require('simple-git/promise');

async function cloneTemplate(url, branch) {
    const path = process.cwd()
    // 創建clone倉庫需要用的git
    const cloneGit = simpleGit(path);
    await cloneGit.clone(url, path, { depth: 1 });
}

上傳

開發完成之後,使用npm run convert轉化下代碼,之後npm publish就可以發佈上去了,之後使用的時候全局安裝當前工具就可以開心滴使用了,媽媽再也不用擔心我不會寫命令行工具了!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章