跳至主要内容

[note] 撰寫 CLI 的工具

概念

shebang

Using Shebang #! in Linux Scripts

如果希望 JavaScript 的檔案能夠被在 Terminal 中被當成執行檔直接執行,而不用在最前面加上 node 的話,可以在 JavaScript 檔案的最上方加上 shebang(#!),又稱作 hashbang。

舉例來說,建立一支 hello.js 的檔案:

console.log('Hello');

一般來說,如果要執行這支檔案,需要在執行該檔案前加上 node,例如:

$ node hello

但如果我們希望讓這支檔案能夠類似 shell script 直接被執行的話:

$ ./hello.js

只需要:

  1. 在這支檔案的開頭最上方加上 shebang 宣告,告訴作業系統要用哪個 interpreter 來執行這支檔案:
#!/usr/bin/env node

console.log('Hello');
撰寫 shell script

這裡使用 JavaScript 的檔案示範,如果你寫的是 Shell Script,同樣只需在最上面定義用 shebang 定義 Bash 的來源(可以使用 which bash 找到 bash),例如 #! /bin/bash

  1. 讓這支檔案有被系統執行的權限:
$ chmod +x hello.js

最後就可以直接在 Terminal 中直接執行這支檔案了:

# 直接執行 hello.js 檔,而不需要在最前方加上 node
$ ./hello.js

工具

cleye (TS support)

cleye @ GitHub

Commander

commander @ github

一套方便用來撰寫 Node.js CLI 的工具。

Ora

ora @ github

危險

ora 自 v6 開始只支援 ESM 的寫法,如果專案仍需要支援 CommonJS 需安裝 v5 的版本。

這是一套用來在 Terminal 中出現 spinner 的套件。

const ora = require('ora');

const spinner = ora({
text: 'foobar',
color: 'cyan',
});

spinner.start([text]).stop().succeed([text]).fail([text]).warn([text]).info([text]).clear();

.start() 之後需要呼叫後續的方法才會終止(換行),若單純要產生訊息內容,可以直接使用 spinner.succeed() 等這類方法。使用範例 example.js

顏色添加

kolorist (TS Support)

kolorist @ github

幫 CLI 中的內容增添顏色。

Colors

colors @ github

這是一套用來在 Terminal 中讓文字出現顏色的套件。

colors 會在 String.prototype 添加方法,因此直接針對文字使用:

// 直接針對文字使用
var colors = require('colors');

console.log('hello'.green); // outputs green text
console.log('i like cake and pies'.underline.red); // outputs red underlined text
console.log('inverse the color'.inverse); // inverses the color
console.log('OMG Rainbows!'.rainbow); // rainbow
console.log('Run the trap'.trap); // Drops the bass

使用 color 這個方法:

var colors = require('colors/safe');

console.log(colors.green('hello')); // outputs green text
console.log(colors.red.underline('i like cake and pies')); // outputs red underlined text
console.log(colors.inverse('inverse the color')); // inverses the color
console.log(colors.rainbow('OMG Rainbows!')); // rainbow
console.log(colors.trap('Run the trap')); // Drops the bass

詢問使用者(互動)

clack (TS Support)

clack @ github

Inquirer

inquirer @ github

整理了一系列可以在 Terminal CLI 中讓使用者互動的工具,並且提供了相當完整的範例可以參考。

prompts

prompts @ github

可以詢問使用者問題。

解析使用者在 CLI 帶入的參數

Command Line Args

command-line-args @ GitHub

方便用來讀取使用者在 command line 輸入的參數。

const commandLineArgs = require('command-line-args');

// 定義使用者可以輸入 start 和 end 參數
const optionDefinitions = [
{ name: 'start', alias: 's', type: Number },
{ name: 'end', alias: 'e', type: Number },
];

// 取得使用者在 cmd 中輸入的參數
const options = commandLineArgs(optionDefinitions);
const { start, end } = options;

使用者可以在終端機中輸入

$ node index.js --start 10 --end 20
$ npm start -- --start 960 --end 1040

minimist

minimist @ GitHub

command-line-args 類似,可以用來解析使用者帶入 CLI 的參數。

打包工具

pkgroll

pkgroll @ GitHub

ZX

zx @ github

一套方便用來撰寫 script 檔的工具。

參考其他專案的寫法

Discuss