工具說明
- inquirer.js:一個封裝了常用命令列互動的node.js模組,通過該模組可以很方便地構建一個新的命令列應用。
- shell.js:跨平臺的unix shell命令模組。
- Node版本:由於inquirer.js的非同步方法預設返回Promise,建議使用node.js>=8。
目標
工作中有大量專案上線前最後一步需要執行測試、編譯、更新版本號、提交,甚至執行的命令都是一樣,在這裡我們通過命令列工具將這些步驟一鍵自動化,同時進行預檢查,防止錯漏。
準備
- 建立一個新的Node.js專案。
- 建立檔案bin/my-cli.js,node.js專案通常會把cli入口放在bin目錄下,其他模組放在lib目錄下。
- 在bin/my-cli.js檔案頭部新增
#!/usr/bin/env node
。 - 新增
"bin": {"my-cli": "./bin/my-cli.js"},
到package.json,宣告我們要使用的命令。 - 專案根目錄下執行
npm link
,建立一個全域性命令my-cli
。
稍微修改下my-cli.js
,新增程式碼console.log("I am a cli tool!")
,然後開啟控制檯執行my-cli
命令,如果看到控制檯輸出I am a cli tool!
就表示成功。
安裝依賴
首先安裝主要依賴的兩個模組(關於這兩個模組的使用請參考官方文件)
npm install inquirer shelljs
構建釋出流程自動化
接下來首先實現測試、更新版本號、構建、自動提交發布的自動化
const pkg = JSON.parse(fs.readFileSync(pkgPath, `utf8`));
const { version } = await inquirer.prompt([
{
type: `list`,
name: `version`,
message: `版本號更新方式:`,
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`);
// 執行測試
shelljs.exec(`npm test`);
//通過npm version更新版本號,但不自動新增git tag,而是在構建完成後由cli工具新增
shelljs.exec(`npm version ${version} --no-git-tag-version`);
// 構建
shelljs.exec(`npm run build`);
// 提交發布程式碼
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
新增一個功能:
當檢查到package.json的my-cli
物件的check-baidu-id
屬性為true
時,檢查專案的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);
}
}
最後一步
這樣一個簡單的cli程式就實現完畢了,它自動化了構建釋出流程,構建釋出之前還進行了配置檢查。
在實際專案中,為了提高程式的穩定性,還需要新增檢查當前專案是否存在package.json,防止json解析出錯、執行前確認等功能,具體見示例程式碼。
示例程式碼
地址:https://github.com/Aturan/node-cli-example
結語
雖然上述功能使用shell也可以實現,但程式碼編寫就沒那麼方便快速,而且一旦碰到更復雜的問題,用shell實現就很麻煩,維護也是一個問題。
PS. 其實也可以用python,對於Ubuntu,系統自帶Python是一個優勢,在伺服器不需要安裝環境就可以直接使用,再加上Python也有Inquirer模組。