メインコンテンツへスキップ

Documentation Index

Fetch the complete documentation index at: https://kawax.biz/llms.txt

Use this file to discover all available pages before exploring further.

この記事はソースコード調査に基づく情報です。v0.1タグが付いたばかりの開発初期段階のパッケージです(2026年5月時点)。

Laravel Chiselとは

Laravel Chisel は、Laravelスターターキットから不要な機能を削除するためのポストインストールスクリプトを構築するためのプリミティブを提供するパッケージです。 スターターキットには多くの機能があらかじめ含まれていますが、プロジェクトによっては一部の機能が不要な場合があります。Chiselはこの問題を、インストール後に対話的に「必要な機能だけを残す」仕組みを提供することで解決します。

なぜ必要か

Laravelスターターキットは多くの機能をバンドルしていますが、すべてのプロジェクトですべての機能が必要なわけではありません。例えば:
  • メール認証が不要なプロジェクト
  • パスキー認証を使わないプロジェクト
  • 特定のLivewireコンポーネントが不要な構成
これまでは不要な機能を手動で削除する必要がありましたが、Chiselを使えばインストール時の対話的なプロンプトでカスタマイズが完結します。

chisel.php スクリプトの定義

Chiselを使うスターターキットは、プロジェクトルートに chisel.php ファイルを配置します。このファイルが「どの機能をオプションにするか」を定義します。
<?php

require getenv('LARAVEL_INSTALLER_AUTOLOADER');

use Laravel\Chisel\Chisel;
use Laravel\Chisel\Question;

return Chisel::script(dirname(__DIR__))
    ->questions([
        Question::multiselect(
            name: 'auth_features',
            label: 'Which authentication features would you like to enable?',
            options: [
                'email-verification' => 'Email verification',
            ],
            hint: 'Use space to select, enter to confirm.',
        ),
    ])
    ->selected('auth_features', 'email-verification',
        then: function (Chisel $c) {
            // 選択された場合: セクションマーカーを除去してコードを残す
            $c->files(
                'resources/js/pages/settings/profile.tsx',
                'app/Providers/FortifyServiceProvider.php',
            )->removeSectionMarkers('email-verification');
        },
        else: function (Chisel $c) {
            // 選択されなかった場合: 関連ファイルと機能を削除
            $c->php('app/Models/User.php')
                ->removeImport('Illuminate\Contracts\Auth\MustVerifyEmail')
                ->removeInterface('MustVerifyEmail');

            $c->file('config/fortify.php')->removeLinesContaining('Features::emailVerification()');

            $c->files(
                'app/Providers/FortifyServiceProvider.php',
                'resources/js/pages/settings/profile.tsx',
            )->removeSection('email-verification');

            $c->files(
                'resources/js/components/email-verification-notice.tsx',
                'resources/js/pages/auth/verify-email.tsx',
                'tests/Feature/Auth/EmailVerificationTest.php',
                'tests/Feature/Auth/VerificationNotificationTest.php',
            )->delete();
        },
    );

スクリプト定義メソッド

メソッド説明
Chisel::script($directory)スクリプト定義を作成
Question::multiselect(...)複数選択の質問を定義
questions([...])スクリプトの質問を設定
questions()登録された質問を取得
collectAnswers()質問への回答収集を開始
apply($callback)無条件のミューテーションステップを登録
selected($key, $value, then:, else:)単一の選択値で分岐
selectedAny($key, $values, then:, else:)いずれかの値が選択された場合に分岐
selectedAll($key, $values, then:, else:)すべての値が選択された場合に分岐
chisel($answers)登録されたミューテーションを実行

対話的な回答収集

collectAnswers() は回答コレクターを返します。すべてのメソッドはフルエントで任意の順序で呼び出せます。非インタラクティブ環境ではデフォルト値が自動的に使用されます。 外部のArtisanコマンドがLaravel Promptsを使ってプロンプトを表示し、回答をChiselに渡します。
use Illuminate\Console\Command;
use Laravel\Chisel\Chisel;
use Laravel\Chisel\Question;
use RuntimeException;

use function Laravel\Prompts\multiselect;

class InstallFeatures extends Command
{
    protected $signature = 'install:features
        {--answers= : JSON string of answers to skip interactive prompts}';

    public function handle(): void
    {
        $script = require base_path('chisel.php');

        $providedAnswers = $this->option('answers') === null
            ? []
            : json_decode((string) $this->option('answers'), true, 512, JSON_THROW_ON_ERROR);

        $answers = $script
            ->collectAnswers()
            ->onQuestion(fn (Question $question) => match ($question->type) {
                'multiselect' => multiselect(
                    label: $question->label,
                    options: $question->options,
                    default: $question->default ?? [],
                    required: $question->required,
                    hint: $question->hint,
                ),
                default => throw new RuntimeException("Unsupported question type [{$question->type}]."),
            })
            ->interactive($this->input->isInteractive())
            ->withAnswers($providedAnswers);

        $script->chisel($answers);

        $chisel = Chisel::in(base_path());

        $chisel->npm()->install();
        $chisel->npm()->run('build');
    }
}
メソッド説明
onQuestion($callback)質問プロンプトのハンドラを設定
interactive($interactive)インタラクティブモードを設定
withAnswers($answers)事前収集した回答を提供してプロンプトをスキップ

ファイルミューテーション

file($path) で単一ファイルを、files(...$paths) で複数ファイルを対象にします。
メソッド説明
replace($search, $replace)文字列を置換
removeLinesContaining($content)指定文字列を含む行を削除
removeSectionMarkers($tag)セクションマーカーを除去し、コンテンツを残す
removeSection($tag)セクションマーカーとその中のコンテンツを削除
delete()対象ファイルを削除

PHP ASTベース編集

php($path) はPHP ASTを使った編集を提供します。オブジェクトが破棄されるときに変更が自動保存されます。 PHP AST(抽象構文木)の基礎と nikic/php-parser の使い方についてはこちらで解説しています。
メソッド説明
removeImport($class)use 文を削除
removeTrait($trait)クラスからtraitの使用を削除
removeInterface($interface)実装されたinterfaceを削除

Section Markers

オプションのコードをコメントペアで囲みます。
/* @chisel-passkeys */
Fortify::authenticateUsingPasskeys();
/* @end-chisel-passkeys */
JSXファイルでは波括弧({})を使ったブロックコメントを使用します。
{
    /* @chisel-passkeys */
}
<PasskeyButton />;
{
    /* @end-chisel-passkeys */
}
  • removeSectionMarkers('passkeys') — マーカーを削除し、コードは残す
  • removeSection('passkeys') — マーカーもコードも両方削除
chisel- プレフィックスは自動的に付加されます。

npm サポート

メソッド説明
npm()->install()検出されたパッケージマネージャーで依存関係をインストール
npm()->run($script, ...$arguments)パッケージマネージャーのスクリプトを実行
npm()->remove(...$packages)検出されたパッケージマネージャーでパッケージを削除
npm() メソッドはnpm・yarn・pnpm・bunを自動検出します。

現在の開発状況

  • GitHubリポジトリ: laravel/chisel
  • リリース: v0.1 (2026年5月公開)
  • 開発期間: 3ヶ月間の非公開開発を経て公開
ChiselはエンドユーザーがLaravelアプリに直接インストールするパッケージではなく、スターターキットが内部的に使用するライブラリです。将来的にはLaravelの公式スターターキットがChiselを活用したポストインストールスクリプトを提供することが期待されています。

laravel/chisel リポジトリ

ソースコードと最新のAPIリファレンスはこちら。

Laravel スターターキット公式ドキュメント

スターターキット自体の使い方については公式ドキュメントを参照してください。
Last modified on May 16, 2026