🫠

Laravel開発でComposerライブラリがGitブランチ切り替え後に使える理由

に公開

Laravel開発でComposerライブラリがGitブランチ切り替え後に使える理由

はじめに

Laravel×Reactで学習アプリを開発していたときに、不思議な現象に遭遇しました。

状況

  1. mainブランチからstripeブランチを作成・チェックアウト
  2. stripeブランチでcomposer require stripe/stripe-phpを実行
  3. git push origin stripeでプッシュ
  4. mainブランチに戻ってgit pull
  5. なぜかStripeライブラリが使える状態に...🤔

「あれ?composer installしてないのになんで使えるの?」という疑問を持ったので、同じ疑問を持つ方の参考になればと思います。

結論

答え:composer dev実行時にComposerが自動的に依存関係をインストールしていた

詳しく解説

何が起こったのか

実際の流れは以下の通りでした!

# 1. stripeブランチでライブラリをインストール
git checkout -b stripe
composer require stripe/stripe-php  # composer.jsonとcomposer.lockが更新される

# 2. 変更をプッシュ
git add .
git commit -m "Add Stripe library"
git push origin stripe

# 3. mainブランチに戻ってpull
git checkout main
git pull origin main  # composer.jsonが更新される(但しvendor/は.gitignore対象)

# 4. 開発サーバー起動
composer dev  # ここで自動的にStripeがインストールされる!

なぜ自動インストールされたのか

1. composer.jsonの更新

composer require stripe/stripe-phpを実行すると、以下のようにcomposer.jsonが更新されます:

{
    "require": {
        "php": "^8.2",
        "laravel/framework": "^12.0",
        "stripe/stripe-php": "^17.5",  // 追加された
        // ...
    }
}

2. .gitignoreの設定

# vendor/ディレクトリはGit管理対象外
/vendor

つまり、依存関係の定義(composer.json)はGitで管理されるが、実際のライブラリファイル(vendor/)は管理されません。

3. Composerの賢い動作

composer devのようなComposerスクリプトを実行する際、Composerは以下をチェックします。

  • composer.jsonに定義された依存関係
  • vendor/ディレクトリの実際の状態
  • 不足している依存関係があれば自動でインストール

composer devスクリプトの中身

私のプロジェクトのcomposer devは以下のような内容でした。

{
    "scripts": {
        "dev": [
            "Composer\\Config::disableProcessTimeout",
            "npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite --kill-others"
        ]
    }
}

このスクリプト実行前に、Composerが依存関係をチェック・インストールしてくれていたのです。

正しい理解

本来あるべき手順

# mainブランチに戻った後
git checkout main
git pull origin main

# 依存関係を明示的にインストール
composer install  # composer.lockに基づいてインストール

# 開発サーバー起動
composer dev

なぜcomposer installが必要なのか

  • composer.json: 依存関係の定義(「Stripeが必要」)
  • composer.lock: 具体的なバージョン情報(「Stripe 17.5.0を使用」)
  • vendor/: 実際のライブラリファイル(Git管理外)

ブランチ切り替え後はcomposer installで、composer.lockに基づいて正確なバージョンをインストールするのがベストプラクティスです。

まとめ

  • Composerはcomposer.jsonの変更を検知して自動で依存関係をインストールすることがある
  • しかし、明示的にcomposer installを実行する方が安全で確実
  • vendor/ディレクトリは.gitignoreで除外し、依存関係の定義のみをGit管理するのが正解

チームでの注意点

チーム開発では以下を徹底しましょう:

# プルリクエストをマージした後
git pull origin main
composer install  # 依存関係を確実に同期
npm install        # Node.jsの依存関係も同期

これで「あれ?動かない」というトラブルを避けられます!


同じような疑問を持った方の参考になれば幸いです。Laravel開発頑張りましょう!🚀

Discussion