開發(fā)一個(gè)自己的前端CLI工具

前言

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

搭建CLI準(zhǔn)備

每一次成功,我們都是站在巨人的肩膀上扯俱。

首先簡(jiǎn)單介紹幾個(gè)常用的依賴的包

  • commander:命令行接口的完整解決方案书蚪,設(shè)置一些node命令,如help迅栅、usage殊校、version、parse輸入的參數(shù)读存。
  • download-git-repo:git代碼下載庫(kù)箩艺,存到本地。
  • chalk: node終端樣式庫(kù)宪萄,可以修改console的輸出顏色艺谆。
  • inquirer: 用戶與命令行之間的交互問答工具。
  • ora:終端旋轉(zhuǎn)器拜英,loading小圈圈静汤。
  • rimraf:刪除文件。

初始化項(xiàng)目

創(chuàng)建項(xiàng)目文件夾居凶,執(zhí)行以下命令虫给,創(chuàng)建項(xiàng)目package.json。

npm init

初始化結(jié)果

{
  "name": "vadm",
  "version": "0.0.1",
  "description": "vue-admin cli tools",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "vue-admin",
    "vadm"
  ],
  "author": "rushuinet",
  "license": "ISC"
}

編輯項(xiàng)目

修改package.json文件侠碧,添加bin中的CLI將是我們執(zhí)行的命令抹估,和依賴庫(kù)。

{
    "name":"vadm",
    "version":"0.0.1",
    "description":"vue-admin cli tools",
    "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":"rushuinet",
    "license":"ISC"
}

新增bin/vadm目錄文件弄兜,編寫bin/vadm文件药蜻。

#!/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((appName, opts, cmd) => {
    spinner.start("開始下載");
    download(
      "direct:https://github.com/vue-admin/vue-admin.git#main",
      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)
vadm -V
OR 
node bin/vadm -V

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

發(fā)布到npm

npm login 
npm publish

踩坑點(diǎn)

1.required ora和chalk錯(cuò)誤問題: Error [ERR_REQUIRE_ESM]: require() of ES Module

高版本不支持require,目前改為以下版本解決:

    "ora":"^5.1.0",
    "chalk":"^4.1.2",

2.Error: 'git clone' failed with status 128

解決:地址要保證使用的是https模式语泽,地址加前綴,例如:

direct:https://github.com/vue-admin/vue-admin.git

3.Error: 'git checkout' failed with status 1

解決:保證你擁有master分支(不指定分支的情況)视卢,我之前的項(xiàng)目就只有一個(gè)分支叫main踱卵,不符合分支要求,所以會(huì)報(bào)錯(cuò)据过,但是他也會(huì)下載下來惋砂,只是提示不好看
但是如果指定分支的話不會(huì)報(bào)錯(cuò),例如:

direct:https://github.com/vue-admin/vue-admin.git#main

項(xiàng)目地址

https://github.com/vue-admin/vadm

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绳锅,一起剝皮案震驚了整個(gè)濱河市西饵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榨呆,老刑警劉巖罗标,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庸队,死亡現(xiàn)場(chǎng)離奇詭異积蜻,居然都是意外死亡闯割,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門竿拆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宙拉,“玉大人,你說我怎么就攤上這事丙笋⌒怀海” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵御板,是天一觀的道長(zhǎng)锥忿。 經(jīng)常有香客問我,道長(zhǎng)怠肋,這世上最難降的妖魔是什么敬鬓? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮笙各,結(jié)果婚禮上钉答,老公的妹妹穿的比我還像新娘。我一直安慰自己杈抢,他們只是感情好数尿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惶楼,像睡著了一般右蹦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歼捐,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天嫩实,我揣著相機(jī)與錄音,去河邊找鬼窥岩。 笑死甲献,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颂翼。 我是一名探鬼主播晃洒,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼朦乏!你這毒婦竟也來了球及?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤呻疹,失蹤者是張志新(化名)和其女友劉穎吃引,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镊尺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年朦佩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庐氮。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡语稠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弄砍,到底是詐尸還是另有隱情仙畦,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布音婶,位于F島的核電站慨畸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衣式。R本人自食惡果不足惜寸士,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞳收。 院中可真熱鬧碉京,春花似錦、人聲如沸螟深。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)界弧。三九已至凡蜻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垢箕,已是汗流浹背划栓。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留条获,地道東北人忠荞。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像帅掘,于是被迫代替她去往敵國(guó)和親委煤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容