2児のパパ系Webエンジニア
の開発日記
A Dad-of-Two Engineer's Development Diary

Laravel の php artisan dev に乗り換えたら、composer.json の長い concurrently 行を消せた話

Laravel の php artisan dev に乗り換えたら、composer.json の長い concurrently 行を消せた話

🙌 結論から

Laravel 13.16 以降なら、開発サーバーまわりの起動は php artisan dev に任せてしまうのがかなり楽です。

php artisan dev は 2026年6月16日の v13.16.0 で入ったコマンドです。

サーバー・キュー・ログ・Vite を1つのターミナルでまとめて立ち上げてくれます。

その後も毎週のように手が入っていて、9月22日の v13.33.0 では並び順を決める order() まで増えました👀

私は既存プロジェクトの composer.json にあった長い concurrently の1行を消して、こちらに寄せました。

起動するプロセスを PHP のコードで足したり外したりできるのが、正直一番うれしかったところです(^^)

😴 composer run devの中身を覚えていますか

Laravel 11 から 12 あたりで作ったプロジェクトだと、composer.json の scripts.dev に npx concurrently で4つのコマンドを並べた長い1行が入っていると思います。

あれ、中身をちゃんと覚えてる人は少ないんじゃないでしょうか・・・

私はキューのオプションを変えたいときに、毎回あの1行を横スクロールして探していました。。

今の 13.x のスケルトンを見ると、scripts.dev はこうなっています。

"dev": [
    "Composer\\Config::disableProcessTimeout",
    "@php artisan dev"
],

つまり、composer run dev の中身そのものが php artisan dev に置き換わっています。

既存プロジェクトも同じ形に書き換えれば、composer run dev の手癖はそのまま使えます👍

💡 起動するのはこの4つです

フレームワーク側で最初から登録されているのは、次の4つです(v13.34.0 のソースで確認)。

名前実行されるコマンド条件
serverphp artisan serveなし
queuephp artisan queue:listen --tries=1 --timeout=0なし
logsphp artisan pail --timeout=0Pail が入っていて、PHP で pcntl_fork が使えるとき
viteパッケージマネージャーの run devpackage.json があるとき

表示のしかたは3つから選べます。

  • --tabs … コマンドごとにタブで切り替え
  • --stream … 1画面にまとめて流しつつ、TUI で操作できる
  • --inline … 素の出力をそのまま流す(TTY でないときの初期値)

Mac と Linux では、8月11日の v13.25.0 から @laravel/multiplex という Node のツール経由で動くようになりました。

Windows だけは今も concurrently で動きます。

落ちたプロセスは初期設定で自動的に再起動されるので、Vite がこけても気づいたら復活しています✨

どのコマンドが登録されているかは php artisan dev:list で確認できます。

パッケージ側が勝手に足したコマンドもここで分かるので、最初に一度見ておくのがおすすめです。

🔧 私のAppServiceProviderの設定

php artisan dev で動かすプロセスは、Illuminate\Foundation\DevCommands を使って AppServiceProvider の boot() から調整できます。

私のプロジェクトでは、こうしています。

use Illuminate\Foundation\DevCommands;

public function boot(): void
{
    // スケジューラも一緒に動かす
    DevCommands::artisan('schedule:work', 'schedule')->green();

    // キューはリトライありで上書き(同じ名前で登録し直す)
    DevCommands::artisan('queue:listen --tries=3 --timeout=0', 'queue');

    // タブの並び順を固定する
    DevCommands::order(['vite', 'server', 'queue', 'schedule', 'logs']);

    DevCommands::withTimestamps();
}

ポイントは、同じ名前で登録し直すと、フレームワークの初期設定より自分のコードが優先されるところです。

ソースを見ると、登録元が vendor の外(自分のアプリ側)なら優先度が一番高くなる作りでした。

キューのオプションだけ変えたい、といった細かい調整が、元のコマンドを消さずにできます(`・ω・´)

逆に外したいときは DevCommands::except('logs') のように名前で除外できます。

パッケージが足したコマンドをまとめて外す withoutVendorCommands() と、フレームワークの4つを外す withoutDefaultCommands() は、9月1日の v13.30.0 で入りました。

ちなみに、モデルやジョブの設定を PHP 属性で書く話は Laravel 13 の PHP 属性の記事 にまとめています。

「設定を PHP 側に寄せる」流れは、13.x 全体で進んでいる印象です。

🤔 logsが出てこなかった話

入れてすぐ、php artisan dev を実行したのに logs のタブだけ出てきませんでした(・_・;)

原因は、logs の登録条件です。

  • Laravel Pail(laravel/pail)がインストールされていること
  • PHP で pcntl_fork が使えること

私の場合は、古いプロジェクトで Pail を入れていなかったのが原因でした。

composer require laravel/pail --dev を入れたら、logs も並ぶようになりました。

Windows のように pcntl 拡張が無い環境だと、Pail を入れても logs は登録されません。

チームに Windows の人がいるなら、「logs が無いのは仕様」と README に一言書いておくと、問い合わせが減ると思います。

もう1つ、CI やエージェントのように TTY が無い環境で実行すると、自動で --inline 扱いになります。

Claude Code から php artisan dev を起動させたときに TUI が出なかったのはこれでした。

パパ系Webエンジニア〜愛用ガジェット一覧 🛍️

この記事を書いている作業環境のガジェットを楽天ROOMにまとめています ✨ 在宅エンジニアのデスク作りの参考にどうぞ 🙌

🙌 まとめ

php artisan dev に寄せると、開発用プロセスの管理が composer.json の長い1行から、AppServiceProvider の PHP コードに移ります。

足す・外す・並べ替えるがメソッド1つで済むので、チームで設定をそろえるのもかなり楽・・!

v13.16.0 以降なら使えるので、composer run dev の中身を一度のぞいてみてください🙌

※ バージョン番号・料金・機能は今後も変わる可能性があります。最新情報は公式サイトをご確認ください👀

参考になったらシェアしてもらえるとうれしいです🙌

Xでポスト Threads はてブ LINE