本篇博客主要介紹瞭如何使用commander, inquirer以及chalk從零開始,建立屬於本身的命令行工具。javascript
首先咱們先花一分鐘的時間,體驗一下建立本身的命令行cli工具是什麼感受。html
假如咱們的項目名稱叫hello-cli
,使用以下命令新建項目目錄。java
mkdir hello-cli && cd hello-cli
複製代碼
接下里使用npm-init命令來初始化一個簡單的package.json文件。node
npm init -y
複製代碼
-y
命令表示接受npm的一切默認參數設置。而後替換package.json爲以下代碼。git
{
"name": "hello-cli",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": {
"hello": "hello"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"chalk": "^2.4.2",
"commander": "^2.20.0",
"inquirer": "^6.3.1",
"shelljs": "^0.8.3"
}
}
複製代碼
而後使用npm install
安裝依賴。github
在項目根目錄下新建名爲hello
的文件,不須要任何後綴,值得注意的是此時的文件名就是你的cli工具第一個鍵入的命令,例如npm install
,那麼hello
就等價於npm
。並將代碼替換以下。shell
#! /usr/bin/env node
const program = require('commander');
const inquirer = require('inquirer');
const chalk = require('chalk');
program
.command('init')
.alias('i')
.description('初始化項目')
.action(option => {
// 該對象用於存儲全部與用戶交互的數據
let config = {
// 假設咱們須要用戶自定義項目名稱
projectName: null
};
// 使用chalk打印美化的版本信息
console.log(chalk.default.bold('hello v1.0.0'));
// 用於存儲全部的交互步驟,例如讓用戶輸入項目名稱就是其中一個步驟
let promps = [];
if (config.projectName === null) {
promps.push({
type: 'input',
name: 'projectName',
message: '請輸入項目名稱',
validate: input => {
if (!input) {
return '項目名稱不能爲空';
}
// 更新對象中屬性的數據
config.projectName = input;
return true;
}
});
}
// 至此,與用戶的全部交互均已完成,answers是收集到的用戶所填的全部數據
// 同時,這也是你開始操做的地方,這個cli工具的核心代碼應該從這個地方開始
inquirer.prompt(promps).then(async (answers) => {
// do something here
console.log(answers);
});
});
program.parse(process.argv);
複製代碼
那麼問題來了, 在你的項目根目錄下使用npm link
,而後在你本地上就至關於安裝了名爲hello-cli
這樣的一個全局npm包了。其原理是將你本地的項目在全局的node_modules中作了一個軟連接,拿此項目舉例,全局的hello
命令已經指向了你的本地目錄。若是你想取消測試項目在全局中的映射,一樣的進入項根目錄,輸入命令npm unlink
便可。npm
而後搭配如下命令食用你的第一個cli工具吧。若是報錯提示沒有權限,在命令前加上sudo便可。json
hello init
# 或者
# hello i
複製代碼
commander是一個Node.js環境下的命令行接口解決方案。在上面的一分鐘體驗例子中,咱們用到了command
,alias
,description
,action
這四個API。後端
command command
表明了這個cli工具向用戶暴露的命令行指令。咱們仍是拿npm install
來舉例子,command('init')
聲明瞭一個叫init的命令,在此處,init等價於install
alias alias
是對於當前命令行指令的更短的指令。例如你們都知道,npm install
能夠簡寫爲npm i
。i
就是定義的alias
description description
是對當前命令行指令的描述,commander會自動的生成當前cli工具的幫助文檔,而該描述就會在hello -h
中展現,若是你的一分鐘體驗項目還在的話,在命令行中輸入hello -h
就能夠看到自動生成的幫助文檔了
action action
是咱們註冊咱們本身回調函數的地方
parse parse
命令則是解析命令行
下面是一分鐘體驗項目中沒有使用的命令,option。仍是舉一個例子。若是有用過hexo的應該熟悉這個命令。
hexo new post $YOUR_POST_NAME
複製代碼
沒用過也不要緊,這個命令是用於建立一個能夠自定義名字的Markdown的文檔的。你們可能會發現,上面的命令包含了4個單詞,而咱們的例子中只有兩個。那是由於一分鐘項目中沒有使用commander的option
API。
若是你想在hello項目中實現同樣的命令,那麼只須要在program中調用該API便可。.option('-p, --post', 'add post')
,而後就能夠經過option
參數獲取到-p後面,用戶輸入的參數的值。
你們也發現了,在命令行輸入init命令後,咱們須要不停地與命令行進行交互拿到數據,可是在代碼裏並無怎麼體現,這是由於咱們用了inquirer來幫咱們作這些事情。
經過inquirer,咱們能夠實現輸入框,獲取用戶的輸入數據,還能夠實現選擇框。舉個例子,用過antd-design-pro應該熟悉建立項目的流程。在命令行中輸入命令yarn create umi
,在以後的流程中就會出現一個可選擇的list。只須要將步驟中的代碼替換成以下便可。
promps.push({
type: 'list',
name: 'projectName',
message: '請輸入項目名稱',
choices: [
{
name: 'ant-design-pro',
value: 'ant-design-pro'
},
{
name: 'dva',
value: 'dva'
}
]
});
複製代碼
在項目中,還使用了validate
來對用戶的輸入數據進行驗證,若是不須要驗證的話,直接把validate整個代碼刪除掉就好。
chalk沒有什麼好介紹的,官網上的文檔已經寫的很詳細了。給你們列一下項目中使用的例子就好。
// 使用默認的字體顏色,加粗字體
console.log(chalk.default.bold('hello v1.0.0'));
// 打印藍色的提示信息
console.log(chalk.blue('hello v1.0.0'));
// 字符串模板用法,在同一行中打印不一樣樣式的信息
console.log(chalk`{white.bold [1/3]} 🔍` + chalk`{default.bold Clone project into local path...}`);
複製代碼
若是你厭倦了Node.js寫後端,想用Java的Spring Boot來寫,可是又擔憂環境的搭建浪費太多時間。那麼你能夠試試venus-init,只須要一行命令即可以快速搭建Java的開發環境。
Happy hacking.