第14章 パッケージ管理

Composerの基礎知識

ComposerはPHPの依存関係管理ツールで、2012年にJordi BoggianoとNils Adermannによって開発されました。その目的は、開発者が自分のPHPプロジェクトで使用するライブラリの依存関係を自動的に管理し、プロジェクトが必要とする特定のバージョンのライブラリを簡単にインストールおよび更新できるようにすることです。

Composerは主に以下の機能を提供します

  • プロジェクトの依存関係の管理:Composerはcomposer.jsonという設定ファイルを使用して、プロジェクトが依存しているライブラリとそのバージョンを追跡します。composer installコマンドを実行すると、Composerはこのファイルを読み込み、指定されたバージョンのライブラリをダウンロードしてインストールします。
  • 依存関係の自動解決:ライブラリにはしばしば他のライブラリへの依存関係がありますが、Composerはこれらの依存関係を自動的に解決し、必要なすべてのライブラリを正しい順序でインストールします。
  • パッケージリポジトリ:ComposerはPackagistというデフォルトのパッケージリポジトリを利用します。Packagistは数千ものPHPライブラリをリストし、それらをComposerで簡単に検索してインストールできるようにしています。
  • 自動オートローディング:Composerはオートローダを生成します。これにより、手動で各ライブラリのクラスをrequireする必要がなくなり、必要なクラスが自動的にロードされます。

Composerは現代のPHP開発において不可欠なツールであり、LaravelやSymfonyなどの主要なPHPフレームワークはComposerを利用してパッケージ管理を行っています。このようにして、ComposerはPHPのエコシステム全体を劇的に改善し、開発者がコードを再利用し、共有し、維持する方法を変えました。


Composerのインストール

# monologというパッケージをインストールする例
php composer.phar require monolog/monolog

これにより、composer.jsonファイルが作成され、依存関係が追加されます。また、vendorディレクトリが作成され、パッケージのソースコードがダウンロードされます。


パッケージのインストール例

# Composerをインストールする
# 公式サイト(https://getcomposer.org/download/)の指示に従います。以下はその一例です。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"


パッケージの更新と削除

# パッケージの更新
php composer.phar update monolog/monolog

# パッケージの削除
php composer.phar remove monolog/monolog

パッケージを更新すると、最新の互換性のあるバージョンに更新されます。パッケージを削除すると、そのパッケージとその依存関係がプロジェクトから削除されます。


autoloadと名前空間

ここでは、Composerのオートローダーを使用してmonolog/monologパッケージを自動的に読み込んでいます。use文を使ってMonologのクラスをインポートし、それを使用しています。

// 依存関係を自動的に読み込む
require __DIR__ . '/vendor/autoload.php';

// Monologのクラスを使用する
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));

// add records to the log
$log->warning('Foo');
$log->error('Bar');

パッケージを更新すると、最新の互換性のあるバージョンに更新されます。パッケージを削除すると、そのパッケージとその依存関係がプロジェクトから削除されます。


composer.json

Composerでは、composer.jsonという設定ファイルを使用してプロジェクトの依存関係とその他のメタデータを管理します。このファイルは通常、プロジェクトのルートディレクトリに配置されます。

以下に、composer.jsonファイルの主なセクションとそれぞれの役割について説明します。

  • name: パッケージの名前。通常は "ベンダー名/パッケージ名" の形式で表されます。
  • description: パッケージの簡単な説明。
  • require: プロジェクトが必要とするパッケージとそのバージョンのリスト。ここに記載されたパッケージは、composer install コマンドでインストールされます。
  • require-dev: デベロッパがテストや開発作業で必要とするパッケージのリスト。これらは composer install --dev コマンドでインストールされます。
  • autoload: Composerのオートローダーによって読み込まれるべきクラスやファイルの情報。
  • repositories: Composerがパッケージを検索するためのリポジトリのリスト。デフォルトではPackagistが使用されます。
  • scripts: 特定のイベントが発生したときに実行されるスクリプト。例えば、パッケージがインストールされた後にスクリプトを実行することができます。
  • config: Composer自体の設定オプション。

具体的なcomposer.jsonファイルの例を以下に示します。

{
    "name": "vendor/myproject",
    "description": "A short description of my project",
    "require": {
        "php": ">=7.3.0",
        "monolog/monolog": "^2.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^9.3"
    },
    "autoload": {
        "psr-4": {
            "MyProject\\": "src/"
        }
    },
    "scripts": {
        "test": "phpunit"
    }
}

この例では、プロジェクトがPHP 7.3.0以降とmonolog/monologパッケージを必要としていること、開発環境ではphpunit/phpunitパッケージも必要であること、またsrc/ディレクトリにある MyProject ネームスペースのクラスをオートロードする設定が含まれています。さらに、composer testコマンドが実行されたときにPHPUnitが実行されるようにスクリプトが設定されています。


他のパッケージ管理

PEAR (PHP Extension and Application Repository) と PECL (PHP Extension Community Library) は、PHPの拡張機能とアプリケーションのためのパッケージ管理システムです。PEARとPECLは似たようなものですが、異なる目的で使われます。


PEAR

PEARはPHP用のコードライブラリを提供します。これは、標準的な問題を解決するための再利用可能なコード(ユーティリティ関数、データベース抽象レイヤー、XMLパーサーなど)を含むPHPアプリケーションのリポジトリと考えることができます。PEARパッケージは一般的に純粋なPHPで書かれており、任意のPHPアプリケーションに組み込むことが可能です。


PECL

一方で、PECLはPHPのコア機能を拡張するためのC言語で書かれたモジュールのリポジトリです。これらの拡張機能はPHPのパフォーマンスを向上させたり、PHPがサポートしていない特定のシステム機能へのアクセスを提供したりするために使用されます。


PEARおよびPECLはそれぞれ独自のパッケージ管理システムを持っており、これにより開発者は容易にパッケージを検索、インストール、アップデート、削除することができます。しかし、最近ではComposerがPHPの主流のパッケージ管理システムとなり、PEARやPECLはあまり使われなくなってきています。


練習問題1.

あなたは "my_project" という名前の新しいプロジェクトを作りたいと思います。Composerを使って新しいプロジェクトを作成するためのコマンドは何ですか?


練習問題2.

あなたのプロジェクトでは、人気のあるHTTPクライアントライブラリ "guzzlehttp/guzzle" を使いたいと考えています。 "guzzlehttp/guzzle" をComposerを使ってプロジェクトに追加するためのコマンドは何ですか?


練習問題3.

あなたは、現在インストールされているすべてのパッケージを最新バージョンに更新したいと思います。Composerを使ってすべてのパッケージを更新するためのコマンドは何ですか?