はじめに
普段の開発で「この作業、CLI(コマンドラインツール)にしたいな」と思うことはありませんか?
cac (Command-Line Arguments Commander) は、そんな願いを叶えてくれる究極にミニマルで軽量なCLIライブラリです。
vitestでも使われているcacを使ってコマンドを作るとともに、cacについて調べたことをまとめようと思います。
cac について
コマンドを作る有名なCLIライブラリにはcommanderやyargsがありますが、cacを選ぶ最大の理由はそのシンプルさにあります。
- 軽量: 依存関係が非常に少なく、すぐに動きます。
- 直感的: APIがシンプルで、覚えることが少ないです。
- 高速: 少ないコード量でCLIのコア機能(引数パース)を実装できます。
「まずは動くCLIをサクッと作りたい!」という方に最適です。
環境構築
今回はNode.jsとTypeScript環境を前提とします。
インストール
cac本体をインストールします。
npm install cac
シンプルな「Hello, [Name]」コマンドの作成
1. src/index.ts の作成
まず、ユーザー名を引数に受け取り、挨拶するだけのシンプルなコマンドを作成します。
// src/index.ts
import { cac } from 'cac'
// cacのインスタンスを作成
const cli = cac('my-cli')
// --- コマンド定義 ---
// 1. デフォルトコマンドの定義: <name>を位置引数として受け取る
cli.command('<name>', 'Say hello to the specified user')
// .action()でコマンド実行時の処理を定義
.action((name: string) => {
console.log(`Hello, ${name}!`)
})
// 2. オプションの定義: --version や --help などを自動で生成するために必要
cli.version('1.0.0') // バージョンを定義
cli.help() // ヘルプ表示機能を有効化
// --- CLIの実行 ---
// 引数をパースし、対応するコマンドを実行
cli.parse()
2. 動作確認
ts-nodeを使って作成したファイルを実行してみましょう。
実行
npx ts-node src/index.ts John
# => Hello, John!
ヘルプ表示
npx ts-node src/index.ts --help
# 出力例:
# my-cli/1.0.0
# Say hello to the specified user
#
# Usage:
# $ my-cli <name>
#
# Options:
# -h, --help Display this message
# -v, --version Display version number
たったこれだけで、位置引数を受け取るCLIが完成しました!驚くほどシンプルですね。
より実用的なオプション付きコマンドの作成
次に、--upper オプションを付けて、挨拶の文字を大文字にする機能を追加してみましょう。
1. コードの修正 (src/index.ts)
actionのコールバック関数で、位置引数の後にオプションオブジェクトを受け取るようにします。
// src/index.ts (修正箇所のみ)
// ... (省略) ...
cli.command('<name>', 'Say hello to the specified user')
// .option()でオプションを定義: フラグ(f)とフルネーム(--force)
// 今回は -u, --upper を追加
.option('-u, --upper', 'Convert greeting to uppercase')
.action((name: string, options: { upper?: boolean }) => {
let greeting = `Hello, ${name}!`
// オプションに応じて処理を分岐
if (options.upper) {
greeting = greeting.toUpperCase()
}
console.log(greeting)
})
// ... (省略) ...
2. 動作確認
オプションなし
npx ts-node src/index.ts Jane
# => Hello, Jane!
オプションあり
npx ts-node src/index.ts Jane --upper
# => HELLO, JANE!
cacは、--upper のようなフラグオプションが指定された場合、自動的に options オブジェクトに { upper: true } をセットしてくれます。
まとめと次のステップ
cacを使うことで、複雑な設定なしにTypeScriptでCLIを開発できることがお分かりいただけたかと思います。
| 機能 |
cacのメソッド |
使い方 |
|---|---|---|
| コマンド定義 | .command() |
cli.command('sub <arg>', 'desc') |
| オプション定義 | .option() |
.option('-f, --force', 'Force mode') |
| バージョン | .version() |
cli.version('1.0.0') |
| ヘルプ | .help() |
cli.help() |
次のステップ
- 実用的なサブコマンド: 複数の機能を持つCLIを作成するために、さらにサブコマンドを追加できます
-
package.jsonへの登録:ts-nodeではなく、package.jsonのbinフィールドを使って、グローバルに実行できるように設定できます
シンプルなツールをサクッと作りたい時、ぜひcacを試してみてください!最後までお読みいただきありがとうございました。