本文主要來實現實現一個從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就可以發佈上去了,之後使用的時候全局安裝當前工具就可以開心滴使用了,媽媽再也不用擔心我不會寫命令行工具了!!!