inquirer.js:一個(gè)封裝了常用命令行交互的node.js模塊,通過該模塊可以很方便地構(gòu)建一個(gè)新的命令行應(yīng)用。
shell.js:跨平臺(tái)的unix shell命令模塊。
Node版本:由于inquirer.js的異步方法默認(rèn)返回Promise,建議使用node.js>=8。
工作中有大量項(xiàng)目上線前最后一步需要執(zhí)行測試、編譯、更新版本號(hào)、提交,甚至執(zhí)行的命令都是一樣,在這里我們通過命令行工具將這些步驟一鍵自動(dòng)化,同時(shí)進(jìn)行預(yù)檢查,防止錯(cuò)漏。
創(chuàng)建一個(gè)新的Node.js項(xiàng)目。
創(chuàng)建文件bin/my-cli.js,node.js項(xiàng)目通常會(huì)把cli入口放在bin目錄下,其他模塊放在lib目錄下。
在bin/my-cli.js文件頭部添加#!/usr/bin/env node
。
添加 "bin": {"my-cli": "./bin/my-cli.js"},
到package.json,聲明我們要使用的命令。
項(xiàng)目根目錄下執(zhí)行npm link
,創(chuàng)建一個(gè)全局命令my-cli
。
稍微修改下my-cli.js
,添加代碼console.log("I am a cli tool!")
,然后打開控制臺(tái)運(yùn)行my-cli
命令,如果看到控制臺(tái)輸出I am a cli tool!
就表示成功。
首先安裝主要依賴的兩個(gè)模塊(關(guān)于這兩個(gè)模塊的使用請參考官方文檔)
npm install inquirer shelljs
接下來首先實(shí)現(xiàn)測試、更新版本號(hào)、構(gòu)建、自動(dòng)提交發(fā)布的自動(dòng)化
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); const { version } = await inquirer.prompt([ { type: 'list', name: 'version', message: '版本號(hào)更新方式:', choices: [ { name: `v${semver.inc(pkg.version, 'patch')}: Fix Bugs / Patch`, value: 'patch' }, { name: `v${semver.inc(pkg.version, 'minor')}: Release New Version`, value: 'minor' }, ] } ]); // 拉取最新版本 shelljs.exec('git pull'); // 運(yùn)行測試 shelljs.exec('npm test'); //通過npm version更新版本號(hào),但不自動(dòng)添加git tag,而是在構(gòu)建完成后由cli工具添加 shelljs.exec(`npm version ${version} --no-git-tag-version`); // 構(gòu)建 shelljs.exec('npm run build'); // 提交發(fā)布代碼 const nextVersion = semver.inc(pkg.version, version); shelljs.exec('git add . -A'); shelljs.exec(`git commit -m "build: v${nextVersion}"`) shelljs.exec(`git tag -a v${nextVersion} -m "build: ${nextVersion}"`); shelljs.exec("git push") shelljs.exec("git push --tags");
接下來給my-cli
添加一個(gè)功能:
當(dāng)檢查到package.json的my-cli
對象的check-baidu-id
屬性為true
時(shí),檢查項(xiàng)目的config.json
是否存在baidu-id
屬性
if (pkg['my-cli'] && pkg['my-cli']['check-baidu-id']) { const configPath = path.join(process.cwd(), 'config.json'); if (!fs.existsSync(configPath)) { shelljs.echo('找不到config.json'); shelljs.exit(1); } const config = JSON.parse(fs.readFileSync(configPath, 'utf8')); if (!config['baidu-id']) { shelljs.echo('config.json缺少屬性[baidu-id]'); shelljs.exit(1); }
這樣一個(gè)簡單的cli程序就實(shí)現(xiàn)完畢了,它自動(dòng)化了構(gòu)建發(fā)布流程,構(gòu)建發(fā)布之前還進(jìn)行了配置檢查。
在實(shí)際項(xiàng)目中,為了提高程序的穩(wěn)定性,還需要添加檢查當(dāng)前項(xiàng)目是否存在package.json,防止json解析出錯(cuò)、執(zhí)行前確認(rèn)等功能,具體見示例代碼。
地址:https://github.com/Aturan/node-cli-example
雖然上述功能使用shell也可以實(shí)現(xiàn),但代碼編寫就沒那么方便快速,而且一旦碰到更復(fù)雜的問題,用shell實(shí)現(xiàn)就很麻煩,維護(hù)也是一個(gè)問題。
PS. 其實(shí)也可以用python,對于Ubuntu,系統(tǒng)自帶Python是一個(gè)優(yōu)勢,在服務(wù)器不需要安裝環(huán)境就可以直接使用,再加上Python也有Inquirer模塊。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com