頻繁に使っているけど実は基本がわかっていないという人の多いPHPのパッケージ管理ツールcomposer。Laravelのようなフレームワークを利用しているとパッケージをインストールする時に言われた通りにcomposerコマンドを実行しているが実はcomposerを一から使ったことがない人も多いのではないでしょうか。本文書はcomposerの基本的な使い方が分かっていない人を対象にcomposerを使ったパッケージ管理の基礎の基礎について説明を行います。本書の読み終えると自分で作成したPHPプログラム内でcomposerでインストールしたパッケージを使用できるようになります。

composerのもう一つの機能であるオートローダーの理解を深めたい人は下記の文書がおすすめです。

2020年10月にComposer2.0がリリースされました。本文書の内容はComoser 2.Xでも動作確認を行っています。

Composerとは

Composerとは一体何をしてくれるツールなのでしょう。本文書の冒頭でも説明している通りcomposerはPHP専用のパッケージ管理ツールです。複雑なアプリケーションを構築する場合には他の人が作成したライブラリやパッケージを必ず利用することになります。利用するライブラリは単独ではなくさらに別のライブラリを利用している場合がほとんどで1つライブラリをインストールする場合に依存関係を持つ複数のライブラリをインストールする必要があります。ライブラリはさらにバージョンを持っており手動で依存関係、バージョンを管理しようとすると非常に困難です。そこでそれらの問題を解決してくれるツールがcomposerです。composerを利用してライブラリをインストールすることで関連するライブラリの依存関係を解決して適切なバージョンのライブラリをインストールしてくれます。

Composer2.0へのアップグレード

現在のComposerのバージョンは2です。Compose1.Xを使っている環境でcomposerコマンドを実行すると以下の警告(Warning)が表示されます。

Warning from https://repo.packagist.org: You are using an outdated version of Composer. Composer 2.0 is now available and you should upgrade. See https://getcomposer.org/2

2.Xへのアップグレードはcomposer self-update –2のコマンドで実行することができます。実行するとバージョンを1.Xに戻す方法も表示されます。


 % composer self-update --2
Updating to version 2.0.9 (2 channel).
   Downloading (100%)         
Use composer self-update --rollback to return to version 1.10.12

composer -Vコマンドで現在のバージョンを確認することができます。


 % composer -V
Composer version 2.6.6 2023-12-08 18:32:26

Composerのインストール

Composerでパッケージ管理をするためには、Composerのインストールを行わなければなりません。

インストールは非常に簡単なので、Composerのサイトにアクセスして、ダウンロード方法を確認しましょう。アクセスすると下記のような画面が表示されるので、中ほど右にあるDownloadのリンクをクリックしてください。

composerトップページ画面
composerトップページ画面
ダウンロードの方法は変更されるので、最新版をインストールしたい場合は、Composerサイトに行って、毎回ダウンロード方法を確認して下さい。

composerの理解を深めるために使用するので任意のディレクトリにcomposer用のディレクトリを作成し、そのフォルダの内でダウンロードのページに記載されているコマンドを実行してください。本文書ではmacOSを使用しておりデスクトップにcomposerディレクトリを作成し、その下で作業を行っています。2024/2/27時点でのインストール方法は下記となります。


php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

ターミナルで上記のスクリプトを実行します。


% php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
Installer verified
All settings correct for using Composer
Downloading...

Composer (version 2.0.9) successfully installed to: /Users/mac/Desktop/composer/composer.phar
Use it: php composer.phar

インストールが完了するとコマンドを実行したディレクトリ内にcomposer.pharファイルが作成されます。


$ ls
composer.phar
拡張子pharはphpのarchive(アーカイブ)を表しています

インストールが正常に完了後、php composer.pharを実行してみてください。下記のようにコマンドの使用方法の情報が画面に出力されたら正常にインストールが完了しています。


% php composer.phar 
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.6.6 2023-12-08 18:32:26

Usage:
  command [options] [arguments]


インストールしたcomposerをグローバルで実行したい場合には/usr/local/binに移動させます。/usr/local/binへのPATHが設定されている場合にはどこからでもcomposerコマンドを利用することができます。移動する時にファイル名をcomposer.pharからcomposerに変更しています。


% sudo mv composer.phar /usr/local/bin/composer

composerファイルの保存場所は任意の場所に設定することができるので/usr/local/binに保存しなければいけないということはありません。本文書では/usr/local/binに保存せず、インストールを実行した場所に作成されたcomposer.pharファイルを利用します。

composer.jsonファイルの作成

新規でcomposer.jsonファイルを作成し以下を記載してください。カーリーブレースで囲まれただけで中身は空です。


{

}

composer.jsonを作成した後、composerのinstallオプションを実行します


$ ./composer.phar install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

composer.jsonには、カーリーブレース以外何も記載していませんが、composer.phar installを実行した場所にvendorディレクトリが作成されます。

composerコマンドはcomposer.jsonファイルが存在するディレクトリでしか実行できません。composer.jsonファイルが見つからない場合は、エラーが発生します。

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

composer.jsonを作成しcomposer installを実行後にパッケージのインストールを行ってみましょう。日付や時刻を操作するのに便利なパッケージCarbonをインストールします。

パッケージをインストールする際は、requireオプションを使用します。実行時のログを見るとcarbonのバージョンは2.45で、carbonの他にもpolyfill-mbstringやcontractsといったパッケージも同時にインストールしていることを確認することができます。また、先ほど何も記述していなかったcomposer.jsonも更新されます。更新されたcomposer.jsonにはCarbonの情報が追加されています。

パッケージをインストールする際、composer.jsonの内容に基づき依存関係のチェックを行い、必要なパッケージがあれば追加でインストールを行います。今回は、carbonを明示的に指定してインストールしましたが、Carbonと依存関係にあるpolyfill-mbstring他3つのパッケージも同時にインストールしています。

 % ./composer.phar require nesbot/carbon
Using version ^2.45 for nesbot/carbon
./composer.json has been updated
Running composer update nesbot/carbon
Loading composer repositories with package information
Updating dependencies
Lock file operations: 5 installs, 0 updates, 0 removals
  - Locking nesbot/carbon (2.45.1)

composer.jsonを確認するとインストールしたnesbot/carbonのパッケージが追加されています。


{
    "require": {
        "nesbot/carbon": "^2.45"
    }
}

【パッケージインストールの書式】


$ composer require [vendor_name]/[project_name]

vendor_nameとproject_nameを合わせたものがパッケージ名(package name)です。 project_nameが同じでもvendor_nameが異なれば別のパッケージになります。そのためインストールする場合は、[vendor_name]/[project_name]を指定する必要があります。

インストールしたパッケージを使用する

パッケージのインストールは完了後どのようにCarbonを呼び出して使用するのかわからないという人もいるかと思います。手順は簡単でphpファイルを作成(test.php)し、そのファイルに下記のように記述するだけで、Carbonを使用することができます。


<?php

require 'vendor/autoload.php';

use Carbon\Carbon;

echo Carbon::now();
requireでvendor/autoload.phpファイルを読み込まなければ、Carbonは実行できません。Class Carbon\Carbonのnot foundエラーが発生します。composerのもう一つの重要な機能であるオートローダーがここでは重要な役割を果たします。

実行すると時刻が表示されます。


$ php test.php
2018-12-04 10:30:44

追加のパッケージをインストールする

プログラムを作成していくと新しいパッケージを追加したい場合があります。その場合は、Carbonをインストールした時と同様にrequireオプションを実行すれば追加インストール可能です。

Carbonは時刻を操作するパッケージでしたが、今回は、ログを操作するmonologを追加インストールします。


 % ./composer.phar require monolog/monolog
Using version ^2.2 for monolog/monolog
./composer.json has been updated
Running composer update monolog/monolog
Loading composer repositories with package information
Updating dependencies
Lock file operations: 2 installs, 0 updates, 0 removals
  - Locking monolog/monolog (2.2.0)
  - Locking psr/log (1.1.3) 

インストールが完了するとcomposer.jsonも更新され、2つのパッケージの情報を確認することができます。


{
    "require": {
        "nesbot/carbon": "^2.45",
        "monolog/monolog": "^2.2"
    }
}

インストールしたパッケージCarbonとmonologを使って動作確認してみましょう。下記のプログラムは、現在の時刻をログファイル(your.log)に書き込むといった単純なものです。


<?php

require 'vendor/autoload.php';

use Carbon\Carbon;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('composer');

$log->pushHandler(new StreamHandler(__DIR__ .'/your.log', Logger::WARNING));

$log->warning(Carbon::now());

実行後、作成したファイルと同じディレクトリにyour.logファイルが作成され、実行時刻が記述されています。


[2021-02-18T02:55:26.590154+00:00] composer.WARNING: 2021-02-18 02:55:26 [] []

2つのパッケージをインストールしましたが、composerを利用すれば、簡単に追加したパッケージを使用することができます。

monologについては別の記事で公開済みなので参考にしてみてください。

composer.jsonを利用したインストール

ここまでのインストールはすべてcomposerのコマンドラインで行なってきましたが、composer.jsonファイルの中に記述されている内容を元にパッケージのインストールを行うことができます。

下記のように記述されたcomposer.jsonを別のディレクトリに移動します。composer.jsonを移動したディレクトリでcomposer installを実行するとcomposer.jsonに記述されたパッケージがインストールされます。composer.jsonファイルを元に同じ環境を構築することができます。


{
    "require": {
        "nesbot/carbon": "^2.45",
        "monolog/monolog": "^2.2"
    }
}

composer.lockについて

composer.lockファイルにはcomposerを使ってインストールされた正確なバージョンの情報が記載されています。そのため、別の環境でcomposer.jsonとcomposer.lockを使ってパッケージのインストールを行なった場合は、composer.lockの正確なパッケージの情報を確認するので、全く同じバージョンでパッケージをインストールすることができます。

しかし、composer.jsonだけでインストールすると同じパッケージはインストールされますがバージョンが異なる場合があります。

理由はcomposer.jsonのバージョン指定が特定のバージョン指定ではなく幅をとって指定ができるためです。

下記のcomposer.jsonではバージョンの前に”^”がついているため、2.45以上で3.00未満のパッケージをインストールする設定になっています。インストールした時に2.45.0だったパッケージを数ヶ月間アップデートしないままでいると2.46.0に更新されている可能があります。更新を行わないで同じcomposer.jsonファイルを使用して別の環境でインストールを行うと最新の2.46.0がインストールされてしまうため、パッケージが同じでもバージョンが異なるという状況が発生します.

composer.lockがあれば2.45.0の情報が登録されているので、別の環境でも2.45.0のインストールを行います。


{
    "require": {
        "nesbot/carbon": "^2.45",
        "monolog/monolog": "^2.2"
    }
}

パッケージを更新する

パッケージの更新方法

パッケージの更新を行いたい場合はcomposer updateを実行するとパッケージの更新を行うことができます。


$composer update

個別のパッケージのみ更新を行いたい場合はupdateの後ろにパッケージ名を指定してください。何も更新がなければ、下記のようなメッセージが表示されます。


$ composer update monolog/monolog
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

更新可能なパケージを確認する

更新可能なパッケージがあるかどうか確認したい場合は、composer outdatedコマンドを実行します。実行後、更新可能パッケージがある場合は下記のようにパッケージの情報が表示されます。更新可能はパッケージが無い場合はコマンドを実行しても何も表示されません。


$ composer outdated
monolog/monolog 1.23.0 1.24.0 Sends your logs to files, sockets, inboxes

インストール済みのパッケージを確認する

インストールされているパッケージを確認したい場合は、composer infoまたはcomposer showを実行すると確認することができます。


% composer info
monolog/monolog               2.2.0   Sends your logs to files, sockets, in...
nesbot/carbon                 2.45.1  An API extension for DateTime that su...
psr/log                       1.1.3   Common interface for logging libraries
symfony/polyfill-mbstring     v1.22.1 Symfony polyfill for the Mbstring ext...
symfony/polyfill-php80        v1.22.1 Symfony polyfill backporting some PHP...
symfony/translation           v5.2.3  Provides tools to internationalize yo...
symfony/translation-contracts v2.3.0  Generic abstractions related to trans...

パッケージを削除する

パッケージを削除する前に現在入っているパッケージとcomposer.jsonの中身をチェックしておきましょう。


 % composer show
monolog/monolog               2.2.0   Sends your logs to files, sockets, in...
nesbot/carbon                 2.45.1  An API extension for DateTime that su...
psr/log                       1.1.3   Common interface for logging libraries
symfony/polyfill-mbstring     v1.22.1 Symfony polyfill for the Mbstring ext...
symfony/polyfill-php80        v1.22.1 Symfony polyfill backporting some PHP...
symfony/translation           v5.2.3  Provides tools to internationalize yo...
symfony/translation-contracts v2.3.0  Generic abstractions related to trans...

下記がcomposer.jsonの中身です。


{
    "require": {
        "nesbot/carbon": "^2.45",
        "monolog/monolog": "^2.2"
    }
}

パッケージを削除する時はremoveを使用します。monolog/monologの削除を行います。依存性の確認を行い、monologを含め、2つのパッケージが削除されています。

monologをインストールした時は2つのパッケージがインストールされたので、削除の際も依存関係のある2つのパッケージが削除されています。


 % composer remove monolog/monolog
./composer.json has been updated
Running composer update monolog/monolog
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 0 updates, 2 removals
  - Removing monolog/monolog (2.2.0)
  - Removing psr/log (1.1.3)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 0 updates, 2 removals
  - Removing psr/log (1.1.3)
  - Removing monolog/monolog (2.2.0)
Generating autoload files

composer.jsonからもmonologに関する情報が削除されていることが確認できます。


{
    "require": {
        "nesbot/carbon": "^2.45"
    }
}

vendorディレクトリを確認するとmonologに関するディレクトリが削除されていることが確認できます。

composerのアップデート

composer自体の更新があった場合は、composer self-updateで更新を行うことができます。現在のバージョンは、compser -Vで確認できます。


 % composer -V
Composer version 2.3.9 2022-07-05 16:52:11

composer self-updateを実行します。


% composer self-update
Upgrading to version 2.5.3 (stable channel).
   
Use composer self-update --rollback to return to version 2.3.9

再度compser -vコマンドを実行してバージョンが更新されているか確認します。


 % composer -V
Composer version 2.5.3 2023-02-10 13:23:52

開発環境用と本番環境用にわける

phpunit/phpunitなど開発環境のテストのみで使用するパッケージは–devをつけてインストールすることで通常のインストールとわけることができます。


$ composer require phpunit/phpunit --dev

インストール完了後にcomposer.jsonの中身を確認すると–devをつけずにインストールしたパッケージと分けられており–devでインストールしたパッケージはrequire-devで追加されていることが確認できます。


{
    "require": {
        "nesbot/carbon": "^2.20",
        "monolog/monolog": "1.23"
    },
    "require-dev": {
        "phpunit/phpunit": "^7.5"
    }
}

本番環境でcomposer.jsonを利用してパッケージをインストールをしたい場合は、–no-devを追加することでrequire-devにあるパッケージはインストールされません。インストール時に–devをつけるかつかないかで本番環境と開発環境でインストールするパッケージをわけることができます。

–devでインストールしたパッケージもcomposer install を実行すればインストールが行われます。インストールをしたくない場合に–no-devをつけてインストールを実行します。

パッケージを探す

インストールしたいパッケージを探したい場合は、pakagistを利用することができます。

packagistトップページ
packagistトップページ

Seach packagesにインストールしたいパッケージ名やパッケージの機能に関するキーワードを入れると検索を行い探すことができます。例えばPHPのテストツールを探しているためtestと入力するとテストツールであるphpunitの情報が表示されます。

【付録:composerのメモリ不足エラー】

運用していく中でcompserコマンドでパッケージを追加インストールしようとした場合にメモリ不足のエラーが表示される場合があります。


PHP Fatal error:  Allowed memory size of 1073741824 bytes exhausted (tried to allocate 72 bytes)
PHP Fatal error:  Allowed memory size of 1073741824 bytes exhausted (tried to allocate 72 bytes)
Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.[

その場合は下記のようにmemory_limitを一時的に増やせば回避することができます。本環境では/user/local/binにcomposerが保存されていますが異なる場所に保存されている場合はパスを変更してください。composerのパスはwhich composerコマンドで確認することができます。XXXX/XXXXにパッケージ名を指定してください。


$ php -d memory_limit=2G /usr/local/bin/composer require XXXX/XXXX

まとめ

ここまで読み終えてくれた人はcomposerのパッケージ管理の基礎をしっかりと理解して頂けたかと思います。ぜひ、この知識をより複雑なパッケージ管理が必要なフレームワーク等にも生かしてください。