溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何使用node編寫(xiě)自己的cli工具

發(fā)布時(shí)間:2021-08-07 13:47:25 來(lái)源:億速云 閱讀:150 作者:小新 欄目:web開(kāi)發(fā)

這篇文章主要介紹了如何使用node編寫(xiě)自己的cli工具,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

準(zhǔn)備

開(kāi)發(fā)一個(gè)cli工具前首先要想好它能做什么。以我自己為例,我需要一個(gè)工具,讓我能只輸入一行命令就幫我快速搭建好項(xiàng)目結(jié)構(gòu),就像這樣:

如何使用node編寫(xiě)自己的cli工具

是不是很炫酷?放心,很簡(jiǎn)單。

開(kāi)始

首先創(chuàng)建你的cli項(xiàng)目,并使用npm init創(chuàng)建一個(gè)package.json。

$ mkdir my-cli && cd my-cli
$ npm init

根據(jù)提示一步步創(chuàng)建好package.json。name屬性就是你發(fā)布到npm上的名字,這個(gè)是不能與npm上現(xiàn)有項(xiàng)目重名的,一個(gè)小技巧是使用npm install下載你想要起的包名字,如果報(bào)錯(cuò)404,那么你的包名是可用的。最后創(chuàng)建好的package.json文件像這樣子:

{
 "name": "my-cli",
 "version": "0.0.1",
 "description": "Auto generate project template",
 "main": "index.js",
 "bin": {
  "my-cli": "./index.js"
 },
 "repository": {
  "type": "git",
  "url": "git+https://github.com/hlme/my-cli.git"
 },
 "keywords": [
  "cli"
 ],
 "author": "798400626@qq.com",
 "license": "MIT",
 "bugs": {
  "url": "https://github.com/hlme/my-cli/issues"
 },
 "homepage": "https://github.com/hlme/my-cli#readme"
}

編寫(xiě)可執(zhí)行文件

package.json中有一個(gè)"bin"字段,配置后才可以在控制臺(tái)使用你的命令。

"bin": {
 "my-cli": "./index.js"
}

我們配置了"my-cli"命令來(lái)執(zhí)行index.js文件。用你喜歡的編輯器,在項(xiàng)目主目錄下創(chuàng)建一個(gè)index.js文件。

如何使用node編寫(xiě)自己的cli工具

注意第一行的"#! node"很重要,表示用node來(lái)執(zhí)行這個(gè)文件。如果沒(méi)有這句聲明,就會(huì)在記事本中打開(kāi)index.js文件。

全局安裝你的包

使用 npm install -g 將你當(dāng)前的項(xiàng)目安裝到全局環(huán)境,現(xiàn)在你可以在命令行使用"my-cli"命令了。

如何使用node編寫(xiě)自己的cli工具

用fs模塊快速生成項(xiàng)目模板

我們自定義的指令可以執(zhí)行了,接下來(lái)編寫(xiě)代碼實(shí)現(xiàn)功能。my-cli的主要功能就是生成項(xiàng)目模板,一個(gè)思路是用一個(gè)templates文件夾保存項(xiàng)目模板,然后通過(guò)fs.mkdir()來(lái)創(chuàng)建項(xiàng)目目錄,最后把文件從templates文件夾拷貝到項(xiàng)目中去。

var fs = require('fs');
var path = require('path');

function copyTemplate (from, to) {
 from = path.join(__dirname, 'templates', from);
 write(to, fs.readFileSync(from, 'utf-8'))
}
function write (path, str, mode) {
 fs.writeFileSync(path, str)
}
function mkdir (path, fn) {
 fs.mkdir(path, function (err) {
  fn && fn()
 })
}

核心代碼就這么點(diǎn),是不是非常簡(jiǎn)單?

整個(gè)項(xiàng)目文件結(jié)構(gòu)差不多就這個(gè)樣子,把你需要的文件放到templates文件夾,然后用copyTemplate方法將文件拷貝到項(xiàng)目目錄下。

如何使用node編寫(xiě)自己的cli工具

創(chuàng)建文件目錄和拷貝文件的過(guò)程,代碼看著比較丑陋

如何使用node編寫(xiě)自己的cli工具

接收命令行參數(shù)

平常我們使用命令行工具時(shí)都會(huì)用到參數(shù),如 webpack -p, express -e 等,現(xiàn)在我們來(lái)為自己的cli添加接收命令行參數(shù)的功能。為my-cli設(shè)計(jì)四個(gè)參數(shù),用來(lái)向項(xiàng)目中添加類(lèi)庫(kù)。

$ my-cli -j -s -v -b
//-j :添加jQuery
//-s :添加Swiper
//-v :添加Vue
//-b :添加Bootstrap

使用commander包可以簡(jiǎn)化解析參數(shù)過(guò)程,但是本項(xiàng)目比較簡(jiǎn)單,我也不想額外引入其他的包了,處理一些簡(jiǎn)單的參數(shù)其實(shí)并不難。

node中我們可以使用process.argv來(lái)獲取命令行參數(shù),process.argv是一個(gè)參數(shù)數(shù)組,第一項(xiàng)為node.exe的絕對(duì)路徑,第二項(xiàng)為執(zhí)行該js的絕對(duì)路徑,使用process.argv.slice(2)即可獲取輸入的參數(shù)數(shù)組。

如何使用node編寫(xiě)自己的cli工具

通過(guò)遍歷參數(shù)數(shù)組來(lái)檢查命令中輸入了哪些參數(shù)。如果輸入了預(yù)設(shè)的參數(shù),就為config對(duì)象添加對(duì)應(yīng)的屬性,在生成文件時(shí)根據(jù)onfig判斷是否將模板文件拷貝到項(xiàng)目中。繼續(xù)丑陋的代碼:


如何使用node編寫(xiě)自己的cli工具

本地運(yùn)行

至此我們的項(xiàng)目已經(jīng)基本完成了,使用 npm install -g 將項(xiàng)目安裝到全局環(huán)境,然后新建一個(gè)項(xiàng)目文件夾,使用my-cli命令來(lái)生成項(xiàng)目模板。

如何使用node編寫(xiě)自己的cli工具

發(fā)布到npm倉(cāng)庫(kù)

要想將自己的包發(fā)布到npm上,首先得有一個(gè)npm賬號(hào),創(chuàng)建賬號(hào)非常簡(jiǎn)單,輸入npm adduser,簡(jiǎn)單三步即可完成創(chuàng)建。

如何使用node編寫(xiě)自己的cli工具

創(chuàng)建好user后,使用npm publish即可將當(dāng)前項(xiàng)目發(fā)布到npm上了,以后就可以使用npm install -g my-cli 來(lái)安裝你的cli工具。

如何使用node編寫(xiě)自己的cli工具

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何使用node編寫(xiě)自己的cli工具”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI