2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コマンド作りたいからcac使ってみた

Posted at

はじめに

普段の開発で「この作業、CLI(コマンドラインツール)にしたいな」と思うことはありませんか?
cac (Command-Line Arguments Commander) は、そんな願いを叶えてくれる究極にミニマルで軽量なCLIライブラリです。

vitestでも使われているcacを使ってコマンドを作るとともに、cacについて調べたことをまとめようと思います。

cac について

コマンドを作る有名なCLIライブラリにはcommanderyargsがありますが、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()

次のステップ

  1. 実用的なサブコマンド: 複数の機能を持つCLIを作成するために、さらにサブコマンドを追加できます
  2. package.jsonへの登録: ts-nodeではなく、package.jsonbinフィールドを使って、グローバルに実行できるように設定できます

シンプルなツールをサクッと作りたい時、ぜひcacを試してみてください!最後までお読みいただきありがとうございました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?