【Laravel12】SOLO for Laravelを使ってみた

Laravel

以前、Laravel11向けの記事として、aarondfrancis/solo の記事を書きましたが、パッケージのリポジトリが soloterm/solo に変更になり、使い方も変わったので、Laravel12向けの記事として書き直します。

GitHub - soloterm/solo: Your all-in-one Laravel command to tame local development
Your all-in-one Laravel command to tame local development - soloterm/solo

SOLO for Laravelで何ができるのか

Laravelプロジェクトで開発時に使用する任意のコマンドをSOLOで一元管理できます。

SOLO起動時の自動実行、任意のタイミングでの実行を指定でき、

さらには、コード内から管理するコマンドを追加することも可能です。

登録したコマンドはタブで分割され、各出力の確認、ホットキーによる実行・停止の管理ができます。

今回は、対話入力への対応も出来るようになりました。

Laravelビルトインサーバー起動やマイグレーション、自動テスト等、よく使うコマンドを登録しておくと便利です。

例えば、「php artisan serve」や「npm run dev」など、プロジェクト起動時に実施したい複数のコマンドが、「php artisan solo」だけで全て自動実行できたりします。

執筆時点(2025/04/01)では、Windowsでは使えないため、開発者の Aaron Francis 氏は協力を求めています。

重要

このパッケージにはext-PCNTLが必要なため、Windowsで動作しません。申し訳ありません。それを修正する方法を知っているなら、私に知らせてください!

Solo for Laravel

前提条件

  • Laravel12を使っていきます(Laravel10、11でも可)
  • PHP8.2以降インストール済
  • Composerインストール済
  • Ubuntu24.04(WSL2)上で作業しています
  • screenコマンドインストール済(v5.0.0以降推奨)
  • ロケール設定が適切に行われている(必須ではありません)

screenコマンドインストール

Ubuntu24.04 (WSL2) では、デフォルトではscreenコマンドはインストールされていません。また、apt や apt-get コマンドでインストールできるのは、執筆時点(2025/04/01)では v4.9.1 が最新版のため、screen v5.0.0はGNUのサイトからソースコードをダウンロードしてコンパイルしてインストールする必要があります。macのbrewの場合はv5.0.0になっているようです。

一応、screen v4.9.1でも動作確認できていますが、ログにエラーが出力されます。

aptコマンドでscreenコマンドをインストールする場合:

sudo apt update
sudo apt install screen

ソースコードをダウンロードしてインストールするには、事前に依存パッケージのインストールが必要です。

sudo apt install -y autoconf gcc make libncurses-dev libpam0g-dev

また、screenコマンドが apt や apt-get でインストールされている場合はアンインストールしておくのがベターでしょう。

sudo apt remove screen

screen v5.0.0のソースコードをダウンロードしてインストールする場合:

wget https://ftp.gnu.org/gnu/screen/screen-5.0.0.tar.gz
tar zxf screen-5.0.0.tar.gz
cd screen-5.0.0
./autogen.sh
./configure
make
sudo make install
rm -rf screen-5.0.0*

上記の場合、screenコマンドのインストール先は /usr/local/bin になります。

▼参考サイト:

GNU Screen 5.0.0リリース(20年ぶりのメジャーアップデート?)
ターミナルマルチプレクサであるGNU Screenの20年ぶり?のメジャーリリースである5.0.0がリリースされました。

ロケール設定

ロケール設定がされていない場合、次のようなエラーが出たりします。

bash: line 1: warning: setlocale: LC_ALL: cannot change locale (en_US_POSIX.UTF-8): No such file or directory

※このような場合は、ロケールの設定を適切に行っておきましょう。

※Ubuntu24.04 (WSL2) のデフォルトでは、設定可能なロケールが次の通りです。

※とりあえず日本語を設定したいところですが、現バージョンでは表示が崩れることがある(この辺はissueものですね)ので、米語パッケージをインストールします。

sudo locale-gen en_US.utf8

※「sudo apt install language-pack-en」でも対応可能ですが、英語圏の他のロケールも多数インストールされます。

※これで利用できるロケールが増えます。

※ロケールの設定を「~/.bashrc」に追記しておきます。

export LANG='en_US.utf8'
export LC_ALL="${LANG}";

※ターミナルを開き直すことで適用できます。

※「source ~/.bashrc」の場合は挙動が安定しなかったので、ターミナルの開き直しが良いでしょう。

Laravelプロジェクト新規作成

Laravel12プロジェクト「lara12-solo-app」を新規作成します。

composer create-project laravel/laravel:^12 lara12-solo-app

プロジェクトフォルダに入ります。

cd lara12-solo-app

nodeパッケージをインストールします。

※時間が掛かるので飛ばしても構いません。(viteの利用ができないだけです。)

※筆者の環境では下図の通り11分掛かりました。

npm install

SOLOインストール

開発環境に SOLO をインストールします。

本番環境へのインストールは推奨されていません。代わりに supervisor 等を使えとあります。

composer require soloterm/solo --dev

SOLO をLaravelで使えるようにします。

php artisan solo:install

これにより、「config/solo.php」がpublishされます。

SOLO起動

デフォルトの状態でSOLOを起動してみます。

php artisan solo

実行するとターミナル上で次のような画面が展開されます。

デフォルトでは、次の9コマンドが登録されています。

それぞれのコマンドが横にタブ展開されています。

タブ名コマンド実行
Aboutphp artisan solo:about自動
Logstail -f -n 100 storage_path(‘logs/laravel.log’)自動
Vitenpm run dev自動
Makephp artisan solo:make自動
Dumpsphp artisan solo:dumps任意
Reverbphp artisan reverb:start –debug任意
Pint./vendor/bin/pint –ansi任意
Queuephp artisan queue:wowrk任意
Testsphp artisan test –colors=always任意

これらのコマンドは、「config/solo.php」内で定義されています。

[←][→]キーでタブ間を移動できます。

[q] (キュー) キー(または [Ctrl] + [x] (エックス) キー)でSOLOを終了させることができます。

キーボード操作

キーボード操作がパワーアップしたように思います。

キーの種類が増え、キーバイディングのセットを、「default」と「vim」の2種類から選択できるようになっています。

※コード内のコメントを見たところ、Laravel10のサポートが切れたらLaravel Promptのキーバインディングを使うTODOが書かれていました。

// @TODO once we drop support for Laravel 10, we can bump laravel/prompts to 0.3.3 and then use Key::PAGE_UP
'page_up' => Hotkey::make([Key::SHIFT_UP, "\e[5~"], KeyHandler::PageUp)
    ->label('Page up')
    ->invisible(),

「default」のキーボード操作は次の通りです。

▼ナビゲーション

HOTキー操作
[←][→]タブ切替
[↑][↓]出力内容の上下1行スクロール
[Shift]+[↑]出力内容のページアップ
[Shift]+[↓]出力内容のページダウン
[Page Up]出力内容のページアップ
[Page Down]出力内容のページダウン
[Home]出力内容の先頭へ移動
[End]出力内容の末尾へ移動
[g] (ジー)任意のタブを選択して移動

▼コマンド制御

HOTキー操作
[s] (エス)コマンド実行開始
[r] (アール)コマンド実行再開
[c] (シー)出力クリア
[p] (ピー)出力一時停止
[f] (エフ)出力追尾

▼対話モード

HOTキー操作
[i] (アイ)対話モードに入る
[Ctrl] + [x] (エックス)対話モードから抜ける

▼グローバル

HOTキー操作
[q] (キュー)SOLO終了
[Ctrl] + [c] (シー)SOLO終了

キーバインディングセットの変更

キーバイディングセットには「default」と「vim」の2種類があります。

特に設定しなければ、自動的に「default」が適用されます。

「vim」を適用したい時には、「.env」に「SOLO_KEYBINDING=」の項目を追記します。

SOLO_KEYBINDING=vim

「vim」に設定した場合、「default」に対して次のキー操作が変更になります。

HOTキー操作
[h] (エイチ)左へタブ移動
[l] (エル)右へタブ移動
[k] (ケイ)出力内容を上へ1行スクロール
[j] (ジェイ)出力内容を下へ1行スクロール
[Ctrl] + [u] (ユー)出力内容のページアップ
[Ctrl] + [d] (ディー)出力内容のページダウン

※勿論、「Soloterm\Solo\Hotkeys\DefaultHotkeys」や「Soloterm\Solo\Hotkeys\VimHotkeys」をコピーして独自のキーバインディングセットを自作して指定することも可能ですが、今回は省きます。

SOLOで管理するコマンド

SOLOで管理するコマンドは「config/solo.php」内の「commands」の項目内で定義します。

デフォルトでは次のようになっています。

    'commands' => [
        'About' => 'php artisan solo:about',
        'Logs' => EnhancedTailCommand::file(storage_path('logs/laravel.log')),
        'Vite' => 'npm run dev',
        'Make' => new MakeCommand,
        // 'HTTP' => 'php artisan serve',

        // Lazy commands do not automatically start when Solo starts.
        'Dumps' => Command::from('php artisan solo:dumps')->lazy(),
        'Reverb' => Command::from('php artisan reverb:start --debug')->lazy(),
        'Pint' => Command::from('./vendor/bin/pint --ansi')->lazy(),
        'Queue' => Command::from('php artisan queue:work')->lazy(),
        'Tests' => Command::from('php artisan test --colors=always')->withEnv(['APP_ENV' => 'testing'])->lazy(),
    ],

「About」等の配列キーがそのままタブ名に対応しています。

「php artisan solo:about」等の配列要素の値が、タブに対応して実行されるコマンドになっています。

実行コマンドの指定の仕方は次の3通りです。

▼1.文字列で指定

'About' => 'php artisan solo:about',

▼2.カスタムCommandクラスで指定

「SoloTerm\Solo\Commands\Command」クラスを継承したカスタムコマンドのクラスインスタンスを渡すことができます。

クラス特徴
EnhancedTailCommandtail するファイルをハイライト出力したり、空にしたりできるように拡張されている。
MakeCommand「php artisan make:***」系のコマンドを対話モードで実行できるように拡張されている。
'Logs' => EnhancedTailCommand::file(storage_path('logs/laravel.log')),
'Make' => new MakeCommand,

※勿論、Commandクラスを継承したカスタムコマンドを自作することもできるので、後程プチ自作します。

▼3.Commandクラスで指定

「SoloTerm\Solo\Commands\Command」クラスのfrom()メソッドでコマンドを指定し、クラスインスタンスを返すことで、Commandクラスのメソッドを利用し、lazy()による任意実行や、withEnv()で環境変数を渡すことが、メソッドチェーンを使って指定できます。

lazy()はSOLO起動時には自動実行させたくない場合に使用します。

'Tests' => Command::from('php artisan test --colors=always')->withEnv(['APP_ENV' => 'testing'])->lazy(),

Commandクラスをプチ自作してみる

「php artisan tinker」を使えるようにしてみたいので、

「app/Solo/Commands/TinkerCommand.php」を新規作成してみます。

<?php

namespace App\Solo\Commands;

use SoloTerm\Solo\Commands\Command;

class TinkerCommand extends Command
{
    public function boot(): void
    {
        $this->name = 'Tinker';
        $this->command = 'php artisan tinker';
        $this->interactive = true;
        $this->autostart = true;
    }
}

「boot()」メソッドは、Commandクラスのコンストラクタ内で実行されるメソッドです。

実行するコマンドは「php artisan tinker」で固定なので、

Commandクラスの「$command」プロパティにハードコーディングしておきます。

tinkerは入力してなんぼなので、対話モードを有効にするために「$interactive」プロパティを「true」にしておきます。

※Commandクラスでは「false」になっています。

今回は特に機能は追加しません。

SOLOでの管理コマンドを編集してみる

上記でプチ自作したものも加えて、自分で使いたいものだけにしてみます。

▼「config/solo.php」の「commands」の項目を編集

※冒頭に追記

use App\Solo\Commands\TinkerCommand;

※「commands」の項目を編集

    'commands' => [
        'HTTP' => 'php artisan serve',
        'Vite' => 'npm run dev',
        'Logs' => EnhancedTailCommand::file(storage_path('logs/laravel.log')),
        'Make' => new MakeCommand,
        'Tinker' => new TinkerCommand,
        'Queue' => Command::from('php artisan queue:work')->lazy(),
        'Tests' => Command::from('php artisan test')->withEnv(['APP_ENV' => 'testing'])->lazy(),
    ],

動作確認

SOLOで管理するコマンドを更新した場合、SOLOを再起動後に反映されます。

前段で編集した内容の場合、次のようになります。

[g] (ジー) キーを押下し、移動先のタブリストを出します。

「Tinker」の最初の2文字「ti」を入力すると、タブリストが「Tinker」だけに(あいまい検索で)絞り込まれます。

青いポインター「>」が「Tinker」にフォーカスされた状態で [Enter] キーを押下すると「Tinker」のタブに移動します。

[i] (アイ) キーを押下することで対話モードになり、tinkerのプロンプトに入力できるようになります。

※左上に青背景に黒字で「Interactive」(対話)と表示されています。

※対話モードの最中は、タブ移動はできません。

※そのため、ターミナル下部に表示されていたコマンドが消えています。

試しにモデルを経由してユーザー作成でもしてみましょう。

use App\Models\User;
User::create(['name' => 'Hoge', 'email' => 'hoge@example.com', 'password' => 'pass']);

バッチリ使えていますね。

[Ctrl] + [x] (エックス) キーで対話モードを抜けます。

ターミナル下部にコマンドが表示され、対話モードを抜けたことが判ります。

tinkerを再起動させたい場合は、この状態で[r] (アール) キーを押下すればOKです。

次は「Test」タブに移動してみます。

[s] (エス) キーを押下すると、「php artisan test」コマンドが実行されます。

テーマの変更

SOLOでは「dark」(デフォルト)と「light」の2テーマが提供されています。

「.env」で「SOLO_THEME=」の項目に「light」か「dark」を指定します。

※デフォルトは「dark」です。

SOLO_THEME=light

筆者の場合、VSCodeの「モダンダーク」テーマを使用中なのでこのようになります。

「管理」>「設定」>「ワークベンチ」>「外観」>「Color Theme」

※「管理」>「設定」のショートカットキー: [Ctrl] + [,] (カンマ)

から「ライトモダン」に変更すると下のような配色になります。

※勿論、「SoloTerm\Solo\Themes\LightTheme」を継承して自作のテーマを作成することも可能ですが、面倒なので今回は省きます。

今回は以上です。

  • 1
  • 0
  • 0
  • 0

コメント

タイトルとURLをコピーしました