ルーティング
ファイルベースのコマンドルーティング
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 であると仮定しています):
your-cliyour-cli helloyour-cli project createyour-cli project list以下のように、ディレクトリ構造とコマンド構造が対応していることがわかります:
src/commands/index.ts -> your-clisrc/commands/hello/index.ts -> your-cli hellosrc/commands/project/_schema.ts -> ignoredsrc/commands/project/create.ts -> your-cli project createsrc/commands/project/create.test.ts -> ignoredsrc/commands/project/list.ts -> your-cli project listRune におけるコマンドパスを決定するルールは次のとおりです:
src/commands/index.tsはルートコマンドに対応します。src/commands/hello/index.tsはhelloコマンドに対応します。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.tsとsrc/commands/hello/ディレクトリのように、同じ名前のファイルとコマンドディレクトリを同階層に定義することはできません。
このように Rune では、多くのウェブ開発者にとって親しみやすいファイルベースのコマンドルーティングを利用することで、コマンド全体の構造を一目で把握することができます。Rune はこのコマンドツリーをもとにルーティングを解決し、一致したコマンドモジュールだけを読み込みます。