[PHPのはじめ方] Part29: Composerによる依存管理

PHP

PHP開発をもっと効率的に、スマートに

こんにちは!PHPの学習、順調に進んでいますか?😊 これまでPHPの基本的な文法やデータベース操作などを学んできましたね。 今回は、PHP開発をさらに効率化するための強力なツール、「Composer」について学びましょう!

Composerは、PHPプロジェクトで利用する外部のライブラリ(パッケージとも呼ばれます)を管理するためのツールです。 例えば、「この機能、便利なライブラリがないかな?」と思ったときに、Composerを使えば簡単にライブラリを探して、自分のプロジェクトに追加・管理することができます。

ライブラリを使うと、自分で一からコードを書かなくても、高度な機能を簡単に実装できるようになります。 しかし、たくさんのライブラリを使うようになると、どのライブラリがどのバージョンに依存しているかなどを手動で管理するのは大変です。💦 Composerは、このような「依存関係」を自動で解決してくれる、まさにPHP開発の救世主なんです!

この章では、以下の内容を学びます。

  • Composerのインストール方法
  • Composerの基本的な使い方(ライブラリの追加、更新)
  • オートローディングの仕組み

Composerをマスターして、モダンなPHP開発の世界へ飛び込みましょう!🚀

Composerを使うためには、まずお使いのコンピュータにComposerをインストールする必要があります。 インストールは、OS(Windows, macOS, Linux)ごとに少し手順が異なりますが、基本的にはComposer公式サイトからインストーラーをダウンロードして実行します。

注意: Composerを実行するには、PHP本体が事前にインストールされている必要があります。まだPHPをインストールしていない場合は、先にインストールを済ませてください。(Step 1の内容を参考にしてくださいね!)

Windowsの場合、公式サイトからComposer-Setup.exeをダウンロードして実行するのが最も簡単です。

  1. Composer公式サイトへアクセスし、「Composer-Setup.exe」をクリックしてダウンロードします。
  2. ダウンロードしたインストーラーを実行します。
  3. インストールモード(全ユーザー or 自分のみ)を選択します。通常は「Install for me only」で問題ありません。
  4. PHPの実行ファイル(php.exe)のパスを指定します。XAMPPなどを使用している場合、自動で検出されることが多いですが、表示されない場合は手動で指定してください。(例: C:\xampp\php\php.exe
  5. プロキシ設定が必要な場合は入力します。通常は不要です。
  6. 「Install」をクリックしてインストールを開始します。
  7. 完了したら、「Next」→「Finish」でインストーラーを閉じます。

コマンドプロンプトやPowerShellを開き、composer --version と入力してバージョン情報が表示されればインストール成功です!🎉

macOSでは、ターミナルを使ってコマンドでインストールするのが一般的です。

Homebrewを使う方法 (推奨):

Homebrewがインストールされていれば、以下のコマンド一つでインストールできます。

brew install composer

手動でインストールする方法:

ターミナルを開き、以下のコマンドを順番に実行します。

# インストーラーをダウンロード
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# インストーラーの正当性を検証 (ハッシュ値は公式サイトで確認してください)
php -r "if (hash_file('sha384', 'composer-setup.php') === 'edb40769019ccf227279e3bdd1f5b2e9950eb000c3233ee85148944e555d97be3ea4f40c3c2fe73b22f875385f6a5155') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

# インストーラーを実行
php composer-setup.php

# インストーラーを削除
php -r "unlink('composer-setup.php');"

# composer.phar をパスの通ったディレクトリに移動して、どこからでも使えるようにする
sudo mv composer.phar /usr/local/bin/composer

ターミナルで composer --version と入力してバージョン情報が表示されればインストール成功です!🎉

Linuxでのインストールも、macOSと同様にターミナルからコマンドを実行します。

  1. ターミナルを開き、Composer公式サイトに記載されている最新のインストールコマンドを実行します。通常は以下の4つのコマンドです。
    # インストーラーをダウンロード
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    
    # インストーラーの正当性を検証 (ハッシュ値は公式サイトで確認してください)
    php -r "if (hash_file('sha384', 'composer-setup.php') === 'edb40769019ccf227279e3bdd1f5b2e9950eb000c3233ee85148944e555d97be3ea4f40c3c2fe73b22f875385f6a5155') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
    
    # インストーラーを実行
    php composer-setup.php
    
    # インストーラーを削除
    php -r "unlink('composer-setup.php');"
  2. ダウンロードした composer.phar を、システム全体で使えるようにパスの通ったディレクトリ(例: /usr/local/bin)に移動します。
    sudo mv composer.phar /usr/local/bin/composer

ターミナルで composer --version と入力してバージョン情報が表示されればインストール成功です!🎉

インストール確認:

どのOSでも、インストール後にターミナル(WindowsではコマンドプロンプトやPowerShell)で以下のコマンドを実行し、バージョン番号が表示されればOKです。

composer --version

例: Composer version 2.7.2 2024-04-05 11:10:30 のような表示が出ます(バージョン番号や日付は異なります)。

Composerのインストールが完了したら、早速基本的な使い方を見ていきましょう!

1. `composer.json` ファイル

Composerを使うプロジェクトでは、まずプロジェクトのルートディレクトリ(一番上の階層)に composer.json というファイルを作成します。 このファイルは、プロジェクトがどのライブラリに依存しているか(どのライブラリを使っているか)を定義するための、いわば「設計図」のようなものです。

最初は空のファイルでも良いですが、手動で作成する代わりに、後述する composer require コマンドを使うと自動で生成・更新されます。

{
    "require": {

    }
}

require の中に、使用したいライブラリ名とそのバージョンを記述していきます。

2. ライブラリの追加 (`composer require`)

プロジェクトに新しいライブラリを追加したい場合、composer require コマンドを使います。 ターミナル(またはコマンドプロンプト)で、プロジェクトのルートディレクトリに移動し、以下の形式でコマンドを実行します。

composer require ベンダー名/パッケージ名

例えば、PHPで人気のロギングライブラリである「Monolog」を追加してみましょう。

composer require monolog/monolog

このコマンドを実行すると、Composerは以下の処理を自動で行います。

  1. Packagist(Composerの公式パッケージリポジトリ)で monolog/monolog を探し、最新の安定バージョンを確認します。
  2. composer.json ファイルに "monolog/monolog": "^バージョン番号" のような行を追加(または更新)します。
  3. Monologが必要とする他のライブラリ(依存ライブラリ)があれば、それらも自動で特定します。
  4. 必要なライブラリ群をダウンロードし、プロジェクトルートに作成される vendor ディレクトリ内に配置します。
  5. 実際にインストールされたライブラリとその正確なバージョン情報を composer.lock ファイルに記録します。

✨ `composer.lock` と `vendor` ディレクトリ

  • composer.lock: 実際にインストールされた各ライブラリの「正確な」バージョンが記録されたファイルです。このファイルがあると、他の開発者や別の環境でも全く同じバージョンのライブラリ構成を再現できます。Gitなどのバージョン管理システムに含めることが強く推奨されます。
  • vendor: Composerによってダウンロードされたライブラリの実際のコードが格納されるディレクトリです。このディレクトリは.gitignoreに追加し、バージョン管理の対象外とするのが一般的です。

3. 依存関係のインストール (`composer install`)

composer.json ファイルや composer.lock ファイルが既にあるプロジェクト(例えば、他の人が作成したプロジェクトをGitからクローンした場合など)で、必要なライブラリをインストールするには composer install コマンドを使います。

composer install

このコマンドは、composer.lock ファイルが存在する場合はその内容に基づいて、存在しない場合は composer.json ファイルに基づいて、必要なライブラリを vendor ディレクトリにインストールします。 チーム開発で環境を統一する際に非常に重要です。

4. ライブラリの更新 (`composer update`)

インストール済みのライブラリを、composer.json で指定されたバージョン制約の範囲内で最新版に更新したい場合は、composer update コマンドを使います。

composer update

特定のライブラリだけを更新したい場合は、パッケージ名を指定します。

composer update monolog/monolog

update コマンドを実行すると、composer.lock ファイルも更新されます。

注意: むやみに composer update を実行すると、ライブラリのバージョンが大きく変わり、予期せぬ動作不良を引き起こす可能性があります。更新する際は、変更内容を確認し、テストを行うようにしましょう。

5. オートローディング (`vendor/autoload.php`)

Composerでインストールしたライブラリを使うには、通常、たくさんの require 文を書く必要がありますが、Composerはその手間も省いてくれます! vendor ディレクトリの中に autoload.php というファイルが自動生成されており、このファイルを1行だけ読み込むだけで、インストールしたライブラリのクラスをPHPが自動で見つけられるようになります(オートロード)。

使い方は簡単で、PHPスクリプトの最初に以下のコードを追加するだけです。

<?php

// vendor/autoload.php を読み込む
require __DIR__ . '/vendor/autoload.php';

// これで、インストールしたライブラリのクラスが使えるようになる!
// 例: Monolog を使う場合
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// ロガーを作成
$log = new Logger('mylogger');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));

// ログを出力
$log->warning('これは警告ログです。');
$log->error('これはエラーログです。');

echo 'ログが出力されました!';

?>

require __DIR__ . '/vendor/autoload.php'; の一行だけで、Monolog\LoggerMonolog\Handler\StreamHandler といったクラスが自動的に読み込まれるようになります。とても便利ですね!✨

自分の作成したクラスもオートロードの対象にしたい場合は、`composer.json`に`autoload`セクションを追加し、名前空間とディレクトリの対応を定義します。

{
    "require": {
        "monolog/monolog": "^3.5"
    },
    "autoload": {
        "psr-4": {
            "MyApp\\": "src/"
        }
    }
}

上記のように設定した後、`composer dump-autoload` コマンドを実行すると、`src/` ディレクトリ以下のクラスが `MyApp` という名前空間でオートロードされるようになります。

composer dump-autoload

composer.json ファイルには、require 以外にもプロジェクトに関する様々な情報を記述できます。 主要なキーとその役割をいくつか見てみましょう。

キー 説明
name パッケージの名前(ベンダー名/プロジェクト名)。公開ライブラリを作成する場合に重要です。 "monolog/monolog"
description パッケージの簡単な説明。 "Sends your logs to files, sockets, inboxes, databases and various web services"
type パッケージの種類(library, project, metapackage, composer-plugin)。通常は project または library "library"
license パッケージのライセンス(例: MIT, Apache-2.0)。 "MIT"
authors パッケージの作者情報。 [{"name": "Jordi Boggiano", "email": "j.boggiano@seld.be"}]
require 本番環境で必要なライブラリとそのバージョン制約。 {"php": "^8.0", "monolog/monolog": "^3.0"}
require-dev 開発環境でのみ必要なライブラリ(テストツール、デバッグツールなど)。composer install --no-dev で除外できます。 {"phpunit/phpunit": "^10.0", "symfony/var-dumper": "^6.0"}
autoload オートローディングの設定(PSR-4規約など)。 {"psr-4": {"App\\": "src/"}}
config Composerの動作設定(PHPバージョンの指定など)。 {"platform": {"php": "8.1.6"}}
scripts 特定のComposerイベント(install, update 後など)で実行するカスタムスクリプト。 {"post-update-cmd": ["MyVendor\\MyClass::postUpdate"]}

バージョン制約の指定方法

requirerequire-dev でライブラリを指定する際には、バージョンも指定します。 特定のバージョンを固定するのではなく、ある程度の範囲を指定することで、互換性を保ちつつ新しい機能やバグ修正を取り込むことができます。 よく使われるバージョン制約の記号には以下のようなものがあります。

記号 意味 説明
1.2.3 完全一致 "1.2.3" バージョン 1.2.3 のみインストールします。
>, >=, <, <=, != 比較演算子 ">=1.2.0" バージョン 1.2.0 以上をインストールします。
1.2.* ワイルドカード "1.2.*" 1.2系の最新バージョン(例: 1.2.0, 1.2.5, 1.2.99)をインストールします。
~ (チルダ) ティルデ範囲 (Tilde Range) "~1.2.3" >=1.2.3 <1.3.0 と同等。マイナーバージョンは上げずに、パッチバージョンのみ最新を許容します。
"~1.2" >=1.2.0 <2.0.0 と同等。メジャーバージョンは上げずに、マイナー・パッチバージョンを許容します。(1.2.* とほぼ同じ)
^ (キャレット) キャレット範囲 (Caret Range) "^1.2.3" >=1.2.3 <2.0.0 と同等。後方互換性が保たれる範囲(メジャーバージョンが上がらない範囲)で最新を許容します。(推奨されることが多い)
| または , OR / AND "^1.0 | ^2.0" バージョン 1.x または 2.x の最新を許容します。
">=1.2, <1.5" バージョン 1.2 以上 かつ 1.5 未満を許容します。

一般的には、後方互換性を維持しつつ新しい機能や修正を取り込める ^ (キャレット) を使うことが推奨されています。 これにより、意図しない大きな変更(メジャーバージョンアップ)による互換性の問題を避けやすくなります。

コメント

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