🫥

vendorフォルダって何?Laravel初心者が理解すべきComposerの仕組み

に公開

vendorフォルダって何?Laravel初心者が理解すべきComposerの仕組み

はじめに

Laravel開発を始めたばかりの頃、こんな疑問を持ったことはありませんか?

  • 「vendorフォルダって何が入ってるの?」
  • 「なぜ.gitignoreに含まれてるの?」
  • 「composer installで何が起こってるの?」
  • 「本番環境にvendorをデプロイしちゃダメなの?」

私もLaravel学習中にこれらの疑問を持ち、調べても難しい説明ばかりで理解に苦労しました。
この記事では、初心者でもわかるようにvendorフォルダの正体と仕組みを解説します!

vendorフォルダの正体

一言で説明すると

vendorフォルダ = 外部ライブラリの実体が保存される倉庫

つまり、「他の人が作ったコードの保管場所」です。

具体例:Stripeライブラリをインストールした場合

composer require stripe/stripe-php

このコマンドを実行すると、以下のような構造になります:

プロジェクト/
├── app/
├── public/
├── vendor/                    # ← 外部ライブラリの倉庫
│   ├── stripe/               # ← Stripeのコード
│   │   └── stripe-php/
│   │       ├── lib/
│   │       │   ├── Stripe.php
│   │       │   ├── Customer.php
│   │       │   └── PaymentIntent.php
│   │       └── README.md
│   ├── laravel/              # ← Laravel本体
│   │   └── framework/
│   ├── symfony/              # ← Symfonyコンポーネント
│   │   ├── console/
│   │   └── http-foundation/
│   └── autoload.php          # ← 重要:自動読み込み機能
├── composer.json             # ← 設計図
└── composer.lock             # ← 材料リスト

なぜvendorが必要なのか?

vendorがない場合(エラー)

<?php
// これは動かない!
$stripe = new \Stripe\Stripe();
// エラー: Fatal error: Class 'Stripe\Stripe' not found

vendorがある場合(正常動作)

<?php
require_once 'vendor/autoload.php'; // 魔法の一行

$stripe = new \Stripe\Stripe(); // 動く!

vendor/autoload.phpが、必要なライブラリを自動で読み込んでくれます。

3つのファイルの関係性

家の建築に例えると理解しやすいです:

ファイル 建築での例 役割
composer.json 設計図 「何が必要か」を定義
composer.lock 材料発注書 「具体的にどのバージョンを使うか」を記録
vendor/ 実際の材料 ダウンロードされた実際のコード

composer.json(設計図)

{
    "require": {
        "stripe/stripe-php": "^17.5",
        "laravel/framework": "^12.0"
    }
}

意味: 「Stripeライブラリの17.5以上と、Laravelフレームワークの12.0以上が必要です」

composer.lock(具体的な記録)

{
    "packages": [
        {
            "name": "stripe/stripe-php",
            "version": "17.5.2",
            "source": {
                "url": "https://github.com/stripe/stripe-php.git"
            }
        }
    ]
}

意味: 「実際にはStripeのバージョン17.5.2を使っています」

vendor/(実物倉庫)

実際にダウンロードされたライブラリのコードファイルが保存されている場所。

なぜvendorは.gitignoreに入れるの?

# .gitignore
/vendor

理由1:ファイルサイズが巨大

# vendorフォルダのサイズを確認
du -sh vendor/
# 結果例: 150MB vendor/

Gitリポジトリが重くなり、クローンに時間がかかってしまいます。

理由2:環境の違い

  • 開発環境:Windows/Mac
  • 本番環境:Linux

バイナリファイルが含まれる場合、OS間で互換性の問題が生じる可能性があります。

理由3:いつでも復元できる

# vendor/を削除しても...
rm -rf vendor/

# いつでも復元可能
composer install

composer.lockがあれば、全く同じ環境を再現できます。

実際のチーム開発フロー

新しいメンバーがプロジェクトに参加する場合

# 1. プロジェクトをクローン
git clone https://github.com/your-project.git
cd your-project

# 2. vendor/はない状態(.gitignoreされているため)
ls vendor/
# ls: vendor/: No such file or directory

# 3. 依存関係をインストール
composer install

# 4. vendor/が復活!全員同じ環境
ls vendor/
# stripe/ laravel/ symfony/ autoload.php

ライブラリを追加する場合

# 開発者Aがライブラリを追加
composer require guzzlehttp/guzzle

# composer.jsonとcomposer.lockが更新される
git add composer.json composer.lock
git commit -m "Add Guzzle HTTP client"
git push

# 他の開発者が同期
git pull
composer install  # 新しいライブラリが自動でインストールされる

本番環境でのベストプラクティス

❌ 良くない方法:vendor/をそのままアップロード

# GitHub Actions(推奨しない例)
- name: FTP Deploy
  uses: SamKirkland/FTP-Deploy-Action@v4.3.4
  with:
    local-dir: ./
    # vendor/もアップロードされてしまう

問題点:

  • アップロード時間が長い
  • 環境の違いで動かない可能性
  • セキュリティリスク

✅ 推奨方法:サーバー側でcomposer install

# サーバー側で実行
cd /var/www/your-app
git pull origin main
composer install --no-dev --optimize-autoloader

メリット:

  • 本番環境に最適化
  • アップロード時間短縮
  • 環境に応じた最適なライブラリがインストールされる

よくある疑問

Q: vendor/を削除しても大丈夫?

A: はい、大丈夫です!

# 削除
rm -rf vendor/

# 復元
composer install

composer.lockがあれば完全に復元できます。

Q: composer.lockもGit管理すべき?

A: 絶対にすべきです!

  • composer.json:「何が必要か」
  • composer.lock:「具体的にどのバージョンを使うか」

チーム全員が同じバージョンを使うために必要です。

Q: vendorを直接編集していい?

A: 絶対にダメです!

# composer installで変更が失われる
composer install
# 直接編集した内容がリセットされる😱

まとめ

要素 役割 Git管理
vendor/ 外部ライブラリの実体 ❌ (.gitignoreで除外)
composer.json 必要なライブラリの定義
composer.lock 具体的なバージョン情報

覚えておきたいポイント

  1. vendor/ = 外部ライブラリの倉庫
  2. Git管理はしない(.gitignore)
  3. composer installでいつでも復元可能
  4. チーム開発ではcomposer.lockを共有
  5. 本番環境ではサーバー側でインストール

さいごに

vendorフォルダの仕組みを理解すると、以下のことがスムーズになります:

  • チーム開発での環境統一
  • 本番環境へのデプロイ
  • ライブラリの管理とアップデート
  • トラブルシューティング

Laravel開発をより楽しく、効率的に進めるための基礎知識として、ぜひ活用してください!


他にもLaravel開発で疑問に思うことがあれば、コメントで教えてくださいね🚀

Discussion