CLI コマンド#
composer require polidog/relayer を入れると次の実行可能ファイルが vendor/bin/ に入ります。
| バイナリ | 役割 |
|---|---|
vendor/bin/relayer | プロジェクトのスキャフォルド/調査(フレームワーク) |
vendor/bin/rosanna-defer | .psx の事前コンパイルと rosanna-defer.js の配置(PSX エンジン、Rosanna) |
vendor/bin/rosanna も入りますが、その compile は Relayer が使う deferred manifest を書き出さないので使いません。
relayer#
引数なし/-h/--help/help で使い方を表示します(引数なしは終了コード 2、明示ヘルプは 0)。未知のコマンドは使い方を出して 2。
vendor/bin/relayer # 使い方(exit 2)
vendor/bin/relayer --help # 使い方(exit 0)サブコマンドのあとの -h / --help は使い方を表示して 0、未知のオプション(- で始まる引数)は使い方を出して 2 で終わります。どちらもファイルを書く前に止まります。
relayer init#
カレントディレクトリにプロジェクト構成をスキャフォルドします。 composer require polidog/relayer 済みのディレクトリで実行します。
- 既存ファイルは 触りません。
composer.jsonは追記的にパッチされ、extra.relayer.structure_versionが刻まれます(手で編集しない)。initはこのマーカーを進めず、どの構造で生成されたかを常に判別できるようにします。前進はrelayer upgradeの仕事です(下記)。 - 生成物に FrankenPHP の開発用コンテナ(
Dockerfile・php.ini・compose.yaml・.dockerignore)が含まれます。ホスト PHP 無しでdocker compose up --build起動(→ はじめに)。 - AI エージェント向け規約ファイルも生成します。
RELAYER.md(ルーティング /Response契約 / CSRF / 設計方針の唯一の正)と、それを指すだけの 2 行AGENTS.md/CLAUDE.md(エージェントツールと Claude Code がそれぞれ自動で読むファイル名)。polidog/relayerに同梱されフレームワークと co-version され、 skip-if-exists(利用者の既存ファイルを上書きしない)。 .claude/配下に Claude Code 向けツールも生成します — トリガー時にルーティング /Response/ CSRF 契約を渡すrelayer-routingskill (.claude/skills/relayer-routing/SKILL.md)と、変更をRELAYER.mdに照らしてレビューするrelayer-reviewersubagent(.claude/agents/relayer-reviewer.md)。いずれもRELAYER.mdを唯一の正とし、同じく co-version・skip-if-exists。.env.local(APP_ENV=dev)を書くのは 新規プロジェクトだけです。.envもマーカーもなく、src/Pages・src/AppConfigurator.php・public/index.php・public/worker.phpのどれもないものを新規とみなします。書く前に.gitignoreが.env.localを除外していることを確かめ(無ければ/.env.localを足します)、確かめられなければ失敗します。.env.localが Git で追跡されているときは作りません。既存のプロジェクトや clone した直後はecho APP_ENV=dev >> .env.localを実行します(→ 環境変数)。App\の PSR-4 マッピングがsrc/以外を指していると 拒否 します(public/index.phpがApp\AppConfigurator=src/前提のため)。- 終了コード:
0成功 /1I/O 失敗 /2誤用(composer.json が無い・JSON でない 等)。
relayer upgrade#
polidog/relayer を上げると、新しいフレームワークバージョンが生成雛形にファイルを追加することがあります。upgrade は既存プロジェクトの構造を、インストール済みフレームワークの構造まで前進させます。relayer init の対になるコマンドです。
composer update polidog/relayer
vendor/bin/relayer upgrade
composer installextra.relayer.structure_versionマーカーを読み、その値から現行バージョンまでの差分を適用し、最後にマーカーを前進させます。マーカーを動かす唯一のコマンドです。- 追加ファイルは skip-if-exists。編集済みファイルはそのまま保持され、skip(
=)として報告されます(非破壊)。 - 以前に配布したファイルの内容が変わる場合もあります(例:
Dockerfileに本番ターゲットが加わる)。この置換は「そのファイルが未編集であること」がゲートです。いずれかのフレームワークバージョンが書いたバイト列と完全一致する場合だけ置き換え(~)、少しでも編集していれば一切触れず keep(!)として報告します。新しいテンプレートを取り込みたい場合は、自分の変更を退避してファイルを削除し、relayer initを実行します。 - 未編集の
.envを置き換えるときは、そこにあるAPP_ENV=devを gitignore 対象の.env.localに移します。ファイルがなければ作り、APP_ENVを指定していなければ行を追記し、指定済みなら触りません。編集済みの.envは残し、.env.localも書かないので、APP_ENVは自分で確かめてください。書く前に.gitignoreが.env.localを除外していることを確かめ、確かめられなければ何も書きません。.env.localが Git で追跡されていると.envと.env.localをそのままにして失敗するので、git rm --cached .env.localを実行してコミットし、再実行します。 - 対象は構造差分とマーカーのみ。composer の scripts や autoload は、存在しないクラスを指すアセット publish スクリプトを
Polidog\Rosanna\Defer\Installer\AssetInstaller::publishに置き換える以外は触れません。足りないものは加算的で安全なので、必要ならrelayer initを再実行してください。 - 冪等。すでに現行バージョンに達していれば「何もすることがない」と報告して終わります。
- マーカーが無いプロジェクトは
relayer initで生成されていないため、まずinitで現行構造を刻印してください。 - 終了コード:
0成功/既に最新 /1I/O・状態エラー /2誤用(composer.json が無い・マーカーが無い 等)。
relayer routes#
src/Pages 配下で検出されたルートを一覧します。パス順にソートされ、メソッド・パス・種別(page / api / native)・ファイルが並び、ルートミドルウェアがあれば末尾に (php) / (native) 付きで示します。
vendor/bin/relayer routesroute.php(API ルート)は宣言済み HTTP メソッドを表示。ページはGET,POST。読めないroute.phpは隠さず?+警告行で示します。src/Pagesが無ければその旨を表示して終了します。
relayer compile#
デプロイ用のアーティファクトをまとめて生成します。.psx(src/Pages と src/Components。無いディレクトリは飛ばします)、routes:compile、container:compile を順に実行し、最初の失敗で止まります。
vendor/bin/relayer compilerelayer native:build#
src/Pages 配下の route.go と middleware.go を var/cache/native/bin にコンパイルします。Go が必要なので relayer compile には含まれません(→ ネイティブルート)。
relayer routes:compile#
ルート表と dispatch pipeline を事前コンパイルします。既定ではルーターはリクエストごとに src/Pages/ を走査し、dispatch listener chain もコンテナタグから組み立てます。これを実行すると 2 つのスナップショットを書き出します:
<projectRoot>/var/cache/routes/routes.php— 検出済みルート表。<projectRoot>/var/cache/routes/dispatcher.php—final class CompiledDispatcher implements DispatchListener。登録済み listener をコンストラクタで受け取り、各 hook を同じ順序で転送します。ファイルを開けば、どの listener がどの順で呼ばれるかが静的に見えます。
デプロイ時に実行します(→ デプロイ)。
vendor/bin/relayer routes:compile- 存在するかどうかだけがゲート(2 ファイルは独立)。
routes.phpがあればルート走査をスキップし、dispatcher.phpがあれば dump を読みます。無ければそれぞれライブ経路に戻ります。dev はコンパイルしないので常に最新のツリーと listener セットを反映し stale になりません。dispatcher.phpが無い場合も同じrelayer.dispatch_listenerタグがRuntimeDispatcher経由で同じ順に呼ばれるため、観測される挙動は同じです。 - 走査時の曖昧さ(
pageとroute.phpの衝突、ルートグループによる URL 衝突)は、本番初回リクエストではなくこのコマンドで失敗します。 dispatcher.phpが焼き込むのは listener のサービス ID(クラス名)だけです。コンストラクタ引数は焼き込まれず、env 由来の値を持つ listener もリクエスト時の live container から解決されます(サービスと DI のcontainer:compile注意点とは独立)。- 出力は常に上記 2 パス(自動生成・手で編集しない。再生成は同コマンド)。
rosanna-defer compile(.psx)とは独立した別ステップで、両方ビルド時に実行します。 - 終了コード:
0成功 /1src/Pagesが無い・走査不能・書き込み失敗。
relayer container:compile#
DI コンテナを事前コンパイルします。既定では Relayer::boot() が毎リクエスト Symfony の ContainerBuilder をビルドして compile() まで回します — 通常これが回避可能なリクエストコストの最大要因です。これを実行すると素の PHP クラス <projectRoot>/var/cache/container/CompiledContainer.php (Polidog\Relayer\Generated\CompiledContainer)にダンプし、本番は再ビルドせずそれを require します。デプロイ時に実行します(→ デプロイ)。
vendor/bin/relayer container:compile- 存在するかどうかだけがゲート。ファイルがあれば本番はそれを使い、無ければライブビルドに戻ります。dev はコンパイルしないので常に最新のサービス設定を反映し stale になりません。
- 不正なサービス定義(
config/services.yaml/App\AppConfiguratorの構成エラー)は、本番初回リクエストではなくこのコマンドで失敗します。relayer routes:compileと同じ「デプロイ時失敗」性質。 - サービス構成を変えたら再生成します(同コマンドを再実行)。出力は常に上記パス(自動生成・手で編集しない)。
rosanna-defer compile(.psx)・routes:compile(ルート表)とは独立した別ステップで、3 つすべてビルド時に実行します。 - 終了コード:
0成功 /1ビルド / ダンプ / 書き込み失敗。
relayer profiler:clear#
dev プロファイラの記録(var/cache/profiler/*.json)を削除します。詳細は プロファイラ 参照。
vendor/bin/relayer profiler:clear冪等で、*.json のみ削除(ディレクトリや他ファイルは残す)。空でも成功 0、削除失敗時は報告して 1。
rosanna-defer compile#
.psx を事前コンパイルしてリクエスト時のコンパイルを無くすビルドステップです。本番デプロイ(デプロイ)で実行します。
vendor/bin/rosanna-defer compile [options] [paths...]- 各パス(ファイル/ディレクトリ)を走査し
.psxをキャッシュディレクトリへコンパイル(ソース絶対パスの sha1 名なのでソースツリーは汚れない)。 manifest.php(PascalCase コンポーネントの FQCN → 生成パス)と、Defer設定を集めたdeferred-manifest.phpを書き出します(Defer コンポーネント はこれで自動登録)。小文字名のpage.psx/layout.psxはコンパイルされますが、マニフェストには載らずパスで直接ロードされます。- 存在しないパスを渡すと exit 1 です(新規プロジェクトには
src/Componentsがないので、まとめてビルドするならrelayer compileを使います)。 - manifest は実行のたびに書き直されます。
src/Componentsとsrc/Pagesは 1 回のコマンドにまとめて渡します。 - ソースハッシュが
*.metaと一致すれば再コンパイルを スキップ (インクリメンタル)。paths省略時の既定は<cwd>/componentsなので、このサイトのような構成ではsrcを明示します。
| オプション | 効果 |
|---|---|
--check | 書き込まず、未更新があれば非ゼロ終了(CI/ビルドのゲート向き) |
--clean | キャッシュディレクトリの中身を削除 |
--watch | .psx 変更で再コンパイル(Ctrl+C で停止) |
--cache=PATH | キャッシュ先(既定 <cwd>/var/cache/psx) |
未知のオプションは exit 1 です。--check と --watch は同時に使えません。
vendor/bin/rosanna-defer compile src # src 配下を事前コンパイル
vendor/bin/rosanna-defer compile --check src # CI: 未コンパイルなら失敗vendor/bin/rosanna-defer publish は public/rosanna-defer.js を配置します。 relayer init が composer の post-install-cmd / post-update-cmd に Polidog\Rosanna\Defer\Installer\AssetInstaller::publish を登録するので、通常は composer install が自動で行います。
このサイトの記事管理 CLI
bin/docs(migrate/list/new/edit/show/ rm/export/import)は relayer ではなくこのサイト固有のツールで、 Turso のストアを直接編集します。フレームワークのコマンドではないので別物として扱ってください(→ デプロイ)。
改訂履歴 (14)
- v1.1.0: usePHP→Rosanna(rosanna-defer)に合わせて更新
- v0.31.0: relayer compile、native:build、usephp compile の失敗条件を追記
- v0.26.0 の relayer upgrade と routes:compile を反映
- v0.22.0: routes:compile から dispatcher.php ダンプを撤去し routes-only に
- v0.21.0 routes:compile が dispatcher.php も書き出す件と RuntimeDispatcher フォールバックを追記
- v0.20.0 container:compile のランタイム secret 注意を追加
- v0.19.0 の relayer container:compile を追記
- サイドバー再構成: 開発カテゴリ追加に伴う order 調整
- relayer routes:compile コマンドを追記
- v0.18.0 の relayer upgrade コマンドを追記
- v0.16.0 の relayer init が CLAUDE.md ポインタも生成する点を反映
- バージョン差分表記(vX.Y.Z 追加/破壊的変更/依存バージョン注記)を削除し現在形に整理
- 更新
- 新規作成