使用node.js構建命令行工具


工具說明

  • inquirer.js:一個封裝了經常使用命令行交互的node.js模塊,經過該模塊能夠很方便地構建一個新的命令行應用。
  • shell.js:跨平臺的unix shell命令模塊。
  • Node版本:因爲inquirer.js的異步方法默認返回Promise,建議使用node.js>=8。

目標

工做中有大量項目上線前最後一步須要執行測試、編譯、更新版本號、提交,甚至執行的命令都是同樣,在這裏咱們經過命令行工具將這些步驟一鍵自動化,同時進行預檢查,防止錯漏。node

準備

  1. 建立一個新的Node.js項目。
  2. 建立文件bin/my-cli.js,node.js項目一般會把cli入口放在bin目錄下,其餘模塊放在lib目錄下。
  3. 在bin/my-cli.js文件頭部添加#!/usr/bin/env node
  4. 添加 "bin": {"my-cli": "./bin/my-cli.js"},到package.json,聲明咱們要使用的命令。
  5. 項目根目錄下執行npm link,建立一個全局命令my-cli

稍微修改下my-cli.js,添加代碼console.log("I am a cli tool!"),而後打開控制檯運行my-cli命令,若是看到控制檯輸出I am a cli tool!就表示成功。python

安裝依賴

首先安裝主要依賴的兩個模塊(關於這兩個模塊的使用請參考官方文檔)git

npm install inquirer shelljsgithub

構建發佈流程自動化

接下來首先實現測試、更新版本號、構建、自動提交發布的自動化shell

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添加一個功能: npm

當檢查到package.json的my-cli對象的check-baidu-id屬性爲true時,檢查項目的config.json是否存在baidu-id屬性json

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模塊。

相關文章
相關標籤/搜索