composerは、phpのプロジェクトで使用されるパッケージを管理するコマンドです。昨今はcomposerなしではphpのプロジェクトは作成できないほど重要なものです。しかし、知らないことがたくさんあります。ということで「composerをもっと知ろう」シリーズです。composerに関するいろいろな面を紹介していきます。

composerがインストールしたパッケージ

まず、最新のLaravelのプロジェクトを作成してみましょう。

$ composer create-project laravel/laravel laravel-11x

composer create-projejtに関しては違う機会に説明するとして、上のコマンド実行後に何のパッケージがインストールされたか見てみましょう。

$ composer show 

を実行すると、以下のように107ものパッケージのリストが、パッケージ名、バージョン、説明を列として表示されます。

brick/math                         0.12.1  Arbitrary-precision arithmetic library
carbonphp/carbon-doctrine-types    3.2.0   Types to use Carbon in Doctrine
dflydev/dot-access-data            3.0.3   Given a deep data structure, access data by dot notation.
doctrine/inflector                 2.0.10  PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.
doctrine/lexer                     3.0.1   PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.
dragonmantank/cron-expression      3.4.0   CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due
egulias/email-validator            4.0.2   A library for validating emails against several RFCs
fakerphp/faker                     1.24.0  Faker is a PHP library that generates fake data for you.
filp/whoops                        2.16.0  php error handling for cool kids
fruitcake/php-cors                 1.3.0   Cross-origin resource sharing library for the Symfony HttpFoundation
graham-campbell/result-type        1.1.3   An Implementation Of The Result Type
guzzlehttp/guzzle                  7.9.2   Guzzle is a PHP HTTP client library
guzzlehttp/promises                2.0.4   Guzzle promises library
guzzlehttp/psr7                    2.7.0   PSR-7 message implementation that also provides common utility methods
guzzlehttp/uri-template            1.0.3   A polyfill class for uri_template of PHP
hamcrest/hamcrest-php              2.0.1   This is the PHP port of Hamcrest Matchers
laravel/framework                  11.31.0 The Laravel Framework.
laravel/pail                       1.2.1   Easily delve into your Laravel application's log files directly from the command line.
laravel/pint                       1.18.1  An opinionated code formatter for PHP.
laravel/prompts                    0.3.2   Add beautiful and user-friendly forms to your command-line applications.
laravel/sail                       1.38.0  Docker files for running a basic Laravel application.
laravel/serializable-closure       1.3.6   Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.
laravel/tinker                     2.10.0  Powerful REPL for the Laravel framework.
league/commonmark                  2.5.3   Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)
..
続く

まだ開発を始めていなのにすでにこれだけのパッケージがインストールされます。上のリストを見ていて気付くのは、もちろんのことですが、Laravel自体もパッケージなのです。上のリストにあるlaravel/frameworkがそうです。他のもlaravelのレポからは6つのパッケージがインストールされます。私が大好きなlaravel/tinkerも含まれます。

composer.jsonの中身を見ればわかりますが、そこでは上のすべてのパッケージを指定はしていません。以下を実行すると指定したパッケージがリストされます。

$ composer show --self

上で、requiresの下にリストされているのが、ライブ環境で必要なパッケージです。phpはすでにインストールされているのでたったの2つです。
requires (dev)は、開発環境において必要なパッケージです。こちらもたったの7つです。

さて、どうしてcomposer showでは107ものパッケージがリストされるのでしょうか?

それは、requiresあるいはrequires (dev)でリストされているそれぞのパッケージがまた違うパッケージを必要とするからです。さらにそのパッケージもまた他のを…と。

例えば、私が好きなtinkerのパッケージを見てみましょう。

$ composer show --tree "laravel/tinker"

ツリー構造はtinkerのパッケージが依存するパッケージを表示します。

パッケージだけでなく、phpのバージョンやphpもモジュール(ext-json *など)の依存もあります。

composerはこれらを全部チェックして、すべてのをまとめて必要なパッケージをインストールします。それぞれパッケージは違うバージョンを指定することもあるので、バージョンの整合性もチェックする必要あります。非常に大変に複雑な作業です。composerの偉大さが理解できますね。

インストールされているパッケージは最新?

インストールしたパッケージたちは時間が経つと、バグの修正や新規のの追加など行われ、インストール時のバージョンと変わってきます。
以下のコマンドは、最新のパッケージの情報を取得してきて見せてくれます。それゆえにコマンド実行には時間がかかります。

$ composer show --latest

それぞれの列は、パッケージ名、インストールされているバージョン、最新のバージョン、そして説明となります。
最新のパージョンに列において緑字は「最新」であり更新の必要はないということで、赤字は更新を「推薦」という意味です。

黄色時は「メジャー」のバージョン更新がリリースされていることを示します。以下は違うプロジェクトからですが、前バージョンのLaravel 10xを使用しており、ご覧のようにLaravel 11xのメジャーリリースがあることを示しています。

先のプロジェクトに戻って、全部ではなく更新を推薦するパッケージのみを見たいなら以下を実行してください。–no-devのオプションは開発のパッケージを表示しません。

$ composer show --outdated --no-dev

メルマガ購読の申し込みはこちらから。

By khino