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メルマガ購読の申し込みはこちらから。