コンテンツにスキップ

ルーティング

ファイルベースのコマンドルーティング

Section titled “ファイルベースのコマンドルーティング”

Rune は、Astro や Next.js などの開発者に馴染みのあるファイルベースのルーティング(file-based routing)のアイデアに基づいた、ファイルベースのコマンドルーティングを使用しています。src/commands 以下のファイル構成からコマンドツリーが構築され、CLI のコマンドパスが決まります。

たとえば、次のようなディレクトリ構造があるとします:

  • ディレクトリsrc
    • ディレクトリcommands/
      • index.ts
      • ディレクトリhello/
        • index.ts
      • ディレクトリproject/
        • _schema.ts
        • create.ts
        • create.test.ts
        • list.ts

Rune では、src/commands 以下の index.ts またはルーティング対象の .ts ファイルがコマンドを定義します。ディレクトリはコマンドのまとまりを表し、index.ts を置いたディレクトリはそのパス自体のコマンドにもなります。こうした対応関係は、Astro などのウェブフレームワークを使っている開発者にとっては、自然に理解できるものでしょう。

上記のディレクトリ構造により以下のコマンドが自動的に利用可能となります(ここでは、あなたの CLI のバイナリ名が your-cli であると仮定しています):

Terminal window
your-cli
your-cli hello
your-cli project create
your-cli project list

以下のように、ディレクトリ構造とコマンド構造が対応していることがわかります:

src/commands/index.ts -> your-cli
src/commands/hello/index.ts -> your-cli hello
src/commands/project/_schema.ts -> ignored
src/commands/project/create.ts -> your-cli project create
src/commands/project/create.test.ts -> ignored
src/commands/project/list.ts -> your-cli project list

Rune におけるコマンドパスを決定するルールは次のとおりです:

  • src/commands/index.ts はルートコマンドに対応します。
  • src/commands/hello/index.tshello コマンドに対応します。
  • src/commands/project/create.ts のようなルーティング対象の .ts ファイルも、そのままサブコマンドに対応します。
  • コマンド名が _ で始まるファイルやディレクトリはルーティング対象外です。_schema.ts_logic.ts_internal/ のようなコマンド専用の補助ファイルをコロケーションするために使えます。
  • コマンド名が .test または .spec で終わるファイルもルーティング対象外です。そのため、src/commands/project/create.test.ts のようなコロケーションされたテストファイルはコマンドになりません。
  • _group.ts はコマンドグループ用の予約メタデータファイルです。group という公開コマンド名と衝突しないよう、_ で始まる名前になっています。
  • src/commands/hello.tssrc/commands/hello/ ディレクトリのように、同じ名前のファイルとコマンドディレクトリを同階層に定義することはできません。

このように Rune では、多くのウェブ開発者にとって親しみやすいファイルベースのコマンドルーティングを利用することで、コマンド全体の構造を一目で把握することができます。Rune はこのコマンドツリーをもとにルーティングを解決し、一致したコマンドモジュールだけを読み込みます。