0基礎(chǔ)教你開(kāi)發(fā)自己的CLI(一)

前言

在前端開(kāi)發(fā)中,擁有一套高效蛉鹿、簡(jiǎn)潔、適合自己的前端項(xiàng)目構(gòu)建工具是非常有必要的往湿。畢竟市面上不是所有的工具都能滿足自己復(fù)雜工作的需要妖异。此外也希望可以將此技術(shù)服務(wù)于其他的伙伴們。

本文分為幾個(gè)章節(jié)领追,本章節(jié)講述cli基礎(chǔ)功能他膳,從初始化項(xiàng)目到clone遠(yuǎn)端模板的流程。敬請(qǐng)期待其他章節(jié)

搭建CLI準(zhǔn)備

每一次成功绒窑,我們都是站在巨人的肩膀上棕孙。

  • 首先簡(jiǎn)單介紹幾個(gè)常用的依賴的包
    commander:命令行接口的完整解決方案,設(shè)置一些node命令些膨,如help蟀俊、usage、version订雾、parse輸入的參數(shù)肢预。
    download-git-repo:git代碼下載庫(kù),存到本地洼哎。
    chalk: node終端樣式庫(kù)烫映,可以修改console的輸出顏色沼本。
    inquirer: 用戶與命令行之間的交互問(wèn)答工具。
    ora:終端旋轉(zhuǎn)器锭沟,loading小圈圈擅威。
    rimraf:刪除文件。

初始化項(xiàng)目

  • 創(chuàng)建項(xiàng)目文件夾冈钦,執(zhí)行以下命令郊丛,創(chuàng)建項(xiàng)目package.json
$ npm init

初始化結(jié)果

{
  "name": "cli",
  "version": "1.0.0",
  "description": "0基礎(chǔ)教你開(kāi)發(fā)自己的CLI",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "cli"
  ],
  "author": "猿話",
  "license": "ISC"
}

編輯項(xiàng)目

  • 修改package.json文件瞧筛,添加bin中的CLI將是我們執(zhí)行的命令厉熟,和依賴庫(kù)
{
  "name": "cli",
  "version": "1.0.0",
  "description": "0基礎(chǔ)教你開(kāi)發(fā)自己的CLI",
  "main": "main.js",
  "bin": {
    "CLI": "./bin/cli"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "inquirer": "^4.0.0",
    "ora": "^1.3.0",
    "rimraf": "^2.6.2",
    "chalk": "^2.3.0",
    "commander": "^2.11.0",
    "download-git-repo": "^1.0.1"
  },
  "keywords": [
    "cli"
  ],
  "author": "猿話",
  "license": "ISC"
}

  • 新增bin/cli目錄文件较幌,編寫(xiě)bin/cli文件揍瑟。

首先我們先編寫(xiě)一個(gè)輸出cli版本號(hào)的命令

#!/usr/bin/env node
//第一行其中#!/usr/bin/env node表示用node解析器執(zhí)行本文件。

const program = require('commander')
const pkg = require('../package')
const chalk = require('chalk')
const download = require('download-git-repo');
const ora = require('ora');
const spinner = ora('Loading undead unicorns');

/**
 * version
 */
program
  .version(chalk.green(`${pkg.version}`))

/**
* init 項(xiàng)目
*/
program
  .command('init <app-name>')
  .description('generate a project from a remote template (legacy API, requires ./wk-init)')
  .option('-c, --clone', 'Use git clone when fetching remote template')
  .action((template, appName, cmd) => {
    spinner.start('開(kāi)始下載');
    download('direct:https://github.com/study-demo/cli-demo.git', appName, { clone: true }, err => {
      if (err) {
        spinner.fail(chalk.green('下載失敗 \n' + err));
        process.exit();
      }
      spinner.succeed(chalk.green(`下載成功`));
    });
  })

program.parse(process.argv)

到此一個(gè)簡(jiǎn)單的cli就搭建完成乍炉。

本地調(diào)試

  • 本地安裝
npm install -g
OR
npm link // 添加軟連接

  • 調(diào)試
// 查看版本號(hào)
CLI -V
OR 
node bin/cli -V

// 初始化項(xiàng)目
CLI init <app-name>
OR 
node bin/cli init <app-name>

發(fā)布到npm

npm login 
npm publish

詳細(xì)信息參考:《一分鐘教你發(fā)布npm包》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绢片,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子岛琼,更是在濱河造成了極大的恐慌底循,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槐瑞,死亡現(xiàn)場(chǎng)離奇詭異熙涤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)困檩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)祠挫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人悼沿,你說(shuō)我怎么就攤上這事等舔。” “怎么了糟趾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵慌植,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拉讯,道長(zhǎng)涤浇,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任魔慷,我火速辦了婚禮只锭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘院尔。我一直安慰自己蜻展,他們只是感情好喉誊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著纵顾,像睡著了一般伍茄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上施逾,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天敷矫,我揣著相機(jī)與錄音,去河邊找鬼汉额。 笑死曹仗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蠕搜。 我是一名探鬼主播怎茫,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼妓灌!你這毒婦竟也來(lái)了轨蛤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤虫埂,失蹤者是張志新(化名)和其女友劉穎祥山,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體告丢,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枪蘑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岖免。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡照捡,死狀恐怖颅湘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栗精,我是刑警寧澤闯参,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站悲立,受9級(jí)特大地震影響鹿寨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜薪夕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一脚草、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧原献,春花似錦馏慨、人聲如沸埂淮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倔撞。三九已至,卻和暖如春慕趴,著一層夾襖步出監(jiān)牢的瞬間痪蝇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工冕房, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躏啰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓毒费,卻偏偏與公主長(zhǎng)得像丙唧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子觅玻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353