通過 npm link、Commander漫雷、download-git-repo瓜富、 inquire.js、child_process搭建自己的腳手架工具

最近集團(tuán)前端越來越多降盹,項(xiàng)目也是超級多与柑,每個(gè)前端技術(shù)能力參差不齊,用的腳手架也是各有不同蓄坏,維護(hù)起來很是不方便价捧,于是就想建立一個(gè)集團(tuán)或者所有人都能用的腳手架工具,統(tǒng)一管理涡戳,所以就需要?jiǎng)?chuàng)建集團(tuán)性質(zhì)的腳手架工具干旧;

// 如:
npm install guoshang -g
guoshang create progectname
微信截圖_20210201104807.png

功能需求:

1、創(chuàng)建全局包妹蔽,通過安裝的全局包管理創(chuàng)建項(xiàng)目,如:vue create progectname挠将;
2胳岂、參數(shù)可選,根據(jù)需求進(jìn)行配置舔稀,自動(dòng)安裝乳丰,如選擇vue,koa2 或 react内贮;
3产园、自動(dòng)執(zhí)行一些 shell 腳本汞斧,如 npm install;


思路:

1、配置 package.json 通過 npm link 生成本地測試環(huán)境什燕;
2粘勒、通過 Commander 插件生成基礎(chǔ)命令(vue也用的這個(gè),是TJ大神搞的)屎即;
3庙睡、通過 download-git-repo 插件,下載模板(沒錯(cuò)技俐,vue也是用的這個(gè))乘陪;
4、通過 inquire.js 實(shí)現(xiàn)命令行選擇配置雕擂,如 vue-cli 的配置選擇啡邑;
5、通過 child_process 模塊井赌,執(zhí)行 shell 腳本谤逼,如 npm install;
6、發(fā)布 npm 包族展;

總體上就是這個(gè)流程森缠,下面會(huì)一一分析具體的每一項(xiàng)細(xì)節(jié),并配上代碼仪缸;


一贵涵、配置本地環(huán)境;

npm link 用來在本地項(xiàng)目和本地npm模塊之間建立連接

"bin": {
    "guoshang": "index.js"
 },

guoshang 就是想要設(shè)置的全局命令名字恰画,index.js 是入口文件

配置好后宾茂,執(zhí)行 npm link 這個(gè)過程可能會(huì)失敗,失敗了就手動(dòng)找到 npm 全局按轉(zhuǎn)包文件地址拴还,刪掉跨晴,從新搞就行,比如我的地址是 C:\Users\86182\AppData\Roaming\npm\node_modules

微信截圖_20210201102125.png

配置成功后 可以執(zhí)行 guoshang 會(huì)出現(xiàn)一些簡單的指令片林,接下來就開始配置自己的指令端盆;

二、利用 Commander 插件生成基礎(chǔ)命令费封;

安裝依賴

npm install commander --save

在Commander模塊下存在option方法用來定義commander的選項(xiàng)options焕妙,用來作為選項(xiàng)的文檔。原文地址:https://www.npmjs.com/package/commander

// 基礎(chǔ)使用
const program = require('commander');

program
  .option('-g, --git [type]', 'Add [marble]', 'Angie')
  .parse(process.argv);

console.log("process.argv",process.argv)
console.log("program.args",program.args)

三弓摘、利用 download-git-repo 下載模板焚鹊;

安裝依賴

npm install download-git-repo --save

原文地址:
https://www.npmjs.com/package/download-git-repo

const download = require('download-git-repo');

download('這個(gè)參數(shù)?', 'test/tmp', function (err) {
  console.log(err ? 'Error' : 'Success')
})

四、inquire.js 實(shí)現(xiàn)命令行選擇配置韧献;

安裝依賴

npm install inquire.js --save

使用腳手架的時(shí)候最明顯的就是與命令行的交互末患,如果想自己做一個(gè)腳手架或者在某些時(shí)候要與用戶進(jìn)行交互研叫,這個(gè)時(shí)候就不得不提到inquirer.js
原文地址:https://www.npmjs.com/package/inquire

2.png

由于交互的問題種類不同,inquirer為每個(gè)問題提供很多參數(shù):

type:表示提問的類型璧针,包括:input, confirm, list, rawlist, expand, checkbox, password, editor嚷炉;
name: 存儲(chǔ)當(dāng)前問題回答的變量;
message:問題的描述陈莽;
default:默認(rèn)值渤昌;
choices:列表選項(xiàng),在某些type下可用走搁,并且包含一個(gè)分隔符(separator)独柑;
validate:對用戶的回答進(jìn)行校驗(yàn);
filter:對用戶的回答進(jìn)行過濾處理私植,返回處理后的值忌栅;
transformer:對用戶回答的顯示效果進(jìn)行處理(如:修改回答的字體或背景顏色),但不會(huì)影響最終的答案的內(nèi)容曲稼;
when:根據(jù)前面問題的回答索绪,判斷當(dāng)前問題是否需要被回答;
pageSize:修改某些type類型下的渲染行數(shù)贫悄;
prefix:修改message默認(rèn)前綴瑞驱;
suffix:修改message默認(rèn)后綴。

// 基礎(chǔ)語法
const promptList = [{
    type: 'list',
    message: '請選擇一種水果:',
    name: 'fruit',
    choices: [
        "Apple",
        "Pear",
        "Banana"
    ],
    filter: function (val) { // 使用filter將回答變?yōu)樾?        return val.toLowerCase();
    }
}];

const inquirer = require('inquirer');

const promptList = [
    // 具體交互內(nèi)容
];

inquirer.prompt(promptList).then(answers => {
    console.log(answers); // 返回的結(jié)果
})

五窄坦、child_process唤反;

child_process模塊是nodejs的一個(gè)子進(jìn)程模塊,可以用來創(chuàng)建一個(gè)子進(jìn)程鸭津,并執(zhí)行一些任務(wù)彤侍。執(zhí)行一些什么任務(wù)呢?shell命令知道吧逆趋,有了child_process模塊盏阶,就可以直接在js里面調(diào)用shell命令去完成一些非常酷炫的操作了N攀椤名斟!
舉個(gè)栗子,GitHub魄眉、碼云等git代碼托管網(wǎng)站砰盐,都會(huì)有個(gè)webHook功能,當(dāng)push了新的代碼后杆融,服務(wù)器可以開辟一個(gè)接口去接受這個(gè)webHook的請求,并進(jìn)行g(shù)it pull霜运、npm run build等命令脾歇,從而達(dá)到自動(dòng)化部署的目的蒋腮!

原文地址:http://nodejs.cn/api/child_process.html

這個(gè)模塊無需安裝,是node的基礎(chǔ)模塊

封裝:

const { spawn } = require('child_process');

const spawnCommand = (...args) => {
  return new Promise((resole, reject) => {
    const childProcess = spawn(...args);
    childProcess.stdout.pipe(process.stdout);
    childProcess.stderr.pipe(process.stderr);
    childProcess.on('close', () => {
      resole();
    })
  })
}

六藕各、發(fā)布模塊池摧;

1、去npm官網(wǎng)注冊賬號激况;
2作彤、命令行登錄賬號,npm login乌逐,然后輸入用戶名密碼和郵箱竭讳;
3、npm publish浙踢;

如果安裝中遇到問題绢慢,可以根據(jù)錯(cuò)誤碼來進(jìn)行修改,遇到問題可以網(wǎng)上搜一下或者給留言洛波;


希望這篇文檔能幫助到你

最后配上 我的全局包源碼地址 https://github.com/jianghaifei/gs-cli

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胰舆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蹬挤,更是在濱河造成了極大的恐慌缚窿,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焰扳,死亡現(xiàn)場離奇詭異倦零,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蓝翰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門光绕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人畜份,你說我怎么就攤上這事诞帐。” “怎么了爆雹?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵停蕉,是天一觀的道長。 經(jīng)常有香客問我钙态,道長慧起,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任册倒,我火速辦了婚禮蚓挤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己灿意,他們只是感情好估灿,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缤剧,像睡著了一般馅袁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荒辕,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天汗销,我揣著相機(jī)與錄音,去河邊找鬼抵窒。 笑死弛针,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的估脆。 我是一名探鬼主播钦奋,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疙赠!你這毒婦竟也來了付材?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤圃阳,失蹤者是張志新(化名)和其女友劉穎厌衔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捍岳,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡富寿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锣夹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片页徐。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖银萍,靈堂內(nèi)的尸體忽然破棺而出变勇,到底是詐尸還是另有隱情,我是刑警寧澤贴唇,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布搀绣,位于F島的核電站,受9級特大地震影響戳气,放射性物質(zhì)發(fā)生泄漏链患。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一瓶您、第九天 我趴在偏房一處隱蔽的房頂上張望麻捻。 院中可真熱鬧纲仍,春花似錦、人聲如沸贸毕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崖咨。三九已至,卻和暖如春油吭,著一層夾襖步出監(jiān)牢的瞬間击蹲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工婉宰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歌豺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓心包,卻偏偏與公主長得像类咧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蟹腾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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