Composerを正しく使う

Composerを正しく使う

PHP向けのパッケージ管理システムであるComposerは、PHP開発にはなくてはならないものになっています。
昔は「PEAR」というものが多く使われていたのですが、最近では影を潜めています。

CakePHP4のインストールはComposer。
LaravelのインストールもComposer。
あれもこれも、あっちもこっちもComposerです(一部未確認)

というわけで、今回はComposerの使い方あれこれの説明です。
本記事ではcomposer.jsonを書き換えてごにょごにょする方法は一切説明していません。
そんなことをする必要はありません。

Composerでインストールできるパッケージ

あれもこれも、あっちもこっちもComposerなんて書きましたが、そもそもインストールできるパッケージはどこで管理されているんでしょう?

これは「Packagist」というサイトで管理されています。

このサイトで「Composer経由でインストールできるパッケージ」が色々とあるわけです。
CakePHP4もLaravelもそうですし、PDF操作用ライブラリだとかとにかくたくさんあります。

Packagistで管理されている各パッケージのインストールを、実行したコマンドに応じて後で説明するcomposer.jsonまたはcomposer.lockの記載内容を確認してインストール(またはアップデート)しますよ!というのがComposerの基本的な挙動になります。

ちなみにpackagistへの登録は誰でもできます。
自作のライブラリとかそういうものも登録できます。
自分はやったことありませんので、興味があればGoogle先生へお聞き下さい。

Composerのパッケージを管理するファイル

コマンド一発で様々なパッケージをインストールできるComposerですが、そのパッケージ自体は「composer.json」と「composer.lock」という2つのファイルで管理されています。
中身はただのJSONファイルです。
使い方というか使われ方というか、その辺がちょっと違います。

composer.jsonファイルとは何か

composer.jsonファイルというものは「Composerからインストールするパッケージを管理」しているファイルになります。
インストールするパッケージ自体は当然のこと、インストールするパッケージのバージョンもcomposer.jsonファイルで管理します。
composer.jsonをベースにしてComposerからパッケージをインストールした後、composer.lockファイルが作成されます。

ですので、既にComposerでインストールしているパッケージのバージョンアップをしたい時などはcomposer.jsonを書き換えるとできたりするのですが、あまり推奨しません(後述)

composer.lockファイルとは何か

composer.lockファイルというものは「Composerでインストールしたパッケージを管理」しているファイルになります。
前項で説明したcomposer.jsonファイルに記載されたパッケージをComposerからインストールし、どのパッケージをどのようなバージョンでインストールしたかという結果が記載されています。

最近はプロジェクト自体をgitで管理することが多いと思います。
で、gitで管理するプロジェクトの中にcomposer.jsonもcomposer.lockも含まれます。
普通は含まれます。.gitignoreにでも書かない限り。
というか、書く必要ありません。書いてはいけません(戒め)

前述の通り、composer.lockというものはComposerでインストール「した」パッケージを管理しているファイルですので、そのファイルを使って各環境で同じパッケージをインストールすればバージョン差異などがなくなるという流れになります。

Composer操作コマンド

と、雑な説明でしたがとりあえずComposerで以下のようなことができるとわかりました。
ひとつはComposer経由でパッケージをインストール、もうひとつはComposer経由でインストールしたパッケージのアップデート。
これ、それぞれコマンドが違います。
雰囲気でComposerコマンドを打たないように気をつけねばいけません(これも自戒)

composer self-update

このコマンドは、Composer自体を最新バージョンに更新する場合に使用します。
ターミナルから以下のコマンドで実行可能です。

$ composer self-update

self-updateと書いてあるのでそのままですね。
実行すると、Composer自体をその時に公開されている最新バージョンで更新します。

あまり使いませんが、Composerのバージョンを指定することもできます。
どうしてもバージョン指定して更新したい場合はこのコマンドの後ろに対象バージョンをオプションで設定すればOKです。

$ composer self-update 2.0.1

というか使い道があるのかどうか知りません。
でもバージョン指定できます。

composer install

このコマンドはcomposer.lockをベースにして、Composerからパッケージをインストールする場合に使用します。
ターミナルから以下のコマンドで実行可能です。

$ composer install

例えばgitで管理されているであろうcomposer.lockをベースにして、開発者みんなで環境を合わせるわけですね。
開発環境に限った話ではなく、本番環境なんかも当然そうなります。

ではcomposer.lockがない場合はどうなるのか。
実はcomposer.lockファイルの有無で挙動が変わるんです、このコマンド。

  1. composer.lockが存在する場合
    composer.lockに記載されたバージョンでパッケージをインストールする。
  2. composer.lockが存在しない場合
    composer.jsonに記載されたパッケージを最新版でインストールし、composer.lockを生成する。

上の方でちょっと書きましたが、Composerでインストールしたプロジェクトをgit管理等する際にcomposer.jsonやcomposer.lockをgit管理対象外にすることはほぼありません。

composer.jsonには割とアバウトな書き方でバージョンが記載されている(メンテナンスバージョンがアスタリスク設定)のですが、composer.lockの方はインストールしたパッケージの詳細バージョンが記載されています。

ので。
composer.lockがある状態でcomposer installを実行すれば、上記の項番1のケースが有効になります。
一方、初回インストール時はcomposer.lockが存在しないので項番2のケースが有効になります。ちなみにComposerを使って初回インストールする時は、packagistで管理されているパッケージ自体にcomposer.jsonが必ず用意されています。
そのファイルを使ってComposer経由で初回インストールを実行するわけです。

と書いてみましたが、なんかわかりにくいですね。
もう一度書きますが、composer.lockというものは「Composerでインストールしたパッケージを管理」が記載されているファイルです。
そこで管理されているのは、パッケージ自体の詳細情報です。
では、パッケージの詳細情報とは何ですかね。
これは例を書いた方がよさそうな気がします。

CakePHP4を例にします。
CakePHP4をインストールする際は以下のコマンドを実行します。

$ composer create-project --prefer-dist cakephp/app cake-sample

端折って説明しますが、上記のコマンド「CakePHP4の最新バージョンでcake-sampleってプロジェクト作るよ!」という意味です。
これ、バージョン指定されてませんよね?(バージョン指定できないわけではないです)
バージョン指定されてませんが、プロジェクトを作成する時のCakePHP4最新バージョンでインストールしてくれます。

この「インストールした時の最新バージョン」がメンテナンスバージョンまで含めてcomposer.lockに記載されているのです。
4.2.1かもしれませんし、4.2.4かもしれませんが、とにかく詳細バージョンが記載されています。

CakePHP4をインストールした時のバージョンによりますが、メンテナンスバージョンまで固定したバージョンがcomposer.lockに書き込まれます。これが「パッケージの詳細情報」になります。

ですので、composer.lockファイルがあればcomposer installコマンドを実行することで全く同じバージョンで環境構築できるということになるのです。

composer update(非推奨)

今度は既にComposer経由で色々インストールしていたと仮定して、インストールされているパッケージをアップデートするコマンドになります。

$ composer update

非推奨と書きましたが、これは個人的な観点です。
自分が関わるプロジェクトでは、このコマンド自体を禁止させています。
理由はこのコマンドの挙動が以下の通りだからです。

composer.lockの内容を無視して、composer.jsonに記載されたパッケージを全て最新版でアップデートし、composer.lockを更新する。

よく見るとcomposer.lockが存在しない場合のcomposer installと同じ挙動なんですが、全てアップデートするのはマズいです。

要するに「composer.lockになんか書いてあるけど一切無視して、composer.jsonに書かれているパッケージの最新版を入れ直してcomposer.lock自体も更新するぜ!」という強気コマンド。
アップデートする必要のないパッケージも全部アップデートです。
これは正直どうかと思います。

時々ブログなんかで目にするのは「composer.jsonを修正してcomposer updateをすれば更新されます」という記事です。

もちろん、そのやり方でもアップデートはできます。
できるのですが、そんなことをしなくてもComposerが用意してくれているコマンドで実現可能です。
というか、そもそもcomposer.jsonを手動で修正してアップデートとかそんな狂った運用しません。

ですので、Composerでインストールされたパッケージをアップデートする時は、次項で説明するcomposer requireを使うようにしましょう。

composer updateをパラメータ無しで実行して大事故を引き起こすなんて話は珍しくないです。
依存関係も一緒にまとめてアップデートする時はまぁ…とは思いますが、Packagist見れば依存関係の記載もありますし。

その辺は各自ご判断下さい。
自分は絶対やりませんけど。

composer updateでメンテナンスバージョンをアップデート

ディスっていたわけではないのですが、composer updateにはひとつだけアップデートらしい挙動をするコマンドがあります。
対象パッケージのメンテナンスバージョンだけアップデートするというコマンドです。

メンテナンスバージョンとか書いて何のことやらと思う方もいるかもしれません。
自分も意識低いのであまり意識してません。でも一応書いておきます。

Packagistに公開されているパッケージはメジャーバージョン、マイナーバージョン、メンテナンスバージョンの3つでバージョン管理されています。

CakePHP4を例に出します。
例えばCakePHP4.2.3というバージョンがあった場合、以下のようになります。

4部分がメジャーバージョン
2部分がマイナーバージョン
3部分がメンテナンスバージョン

このようになっています。
開発中などに使用しているパッケージのメンテナンスバージョンが上がるなんてことはよくあります。
CakePHPなんて呼吸をするように上がっていきます。まぁ別にいいんですけど。

そういう時は以下のコマンドを実行すると、メンテナンスバージョンだけアップデートしてくれます。

$ composer update cakephp/cakephp

このコマンドを実行すると、メンテナンスバージョンだけ最新になります。

インストールされているCakePHP4のバージョンがCakePHP4.2.3だったとします。
でも、CakePHP4.2.4とCakePHP4.3.1が公開されました、なんてこともあったりします。

そういう時、マイナーバージョンは変更せずにメンテナンスバージョンだけを最新にしたい時は多いと思います。
マイナーバージョンを勢いでアップデートして痛い目に遭うことは多いですしね。
そんな時はこのコマンドを実行して下さい。

composer require

恐らく一番実行する機会が多いであろうと思うComposerコマンドです。
composer requireは以下のような時に使用します。

  1. パッケージを追加する場合
  2. インストール済みのパッケージをバージョンアップする場合

追加はわかるけど、何でcomposer updateじゃなくてcomposer requireでアップデートなのか。
わかります。非常によくわかりますが、そうなっているので仕方がありません。
ここがcomposerを雰囲気で理解してる方に多いところでもあります。

composer requireを使ってパッケージを新規インストール

開発途中に必要なライブラリが増えることは珍しくありません。
というかめちゃくちゃ多いと思います。
そういう時は以下のコマンドを実行して、ライブラリのインストールが可能です。

$ composer require tecnickcom/tcpdf

例としてTCPDFというPDF操作ライブラリを追加する一例です。
このコマンドを実行すると、TCPDFの最新バージョンがインストールされます。

バージョンを指定したい場合は以下のようにコマンドを実行すればOKです。

$ composer require tecnickcom/tcpdf:6.2.21

composer requireを使ってパッケージをアップデート

既にインストール済みのパッケージをアップデートする時もcomposer requireを使います。
前項で記載したコマンドと同じなんですけど、以下のようなコマンドです。

$ composer require cakephp/cakephp

今度は例としてCakePHPをアップデートしてみることにしました。

例えば、現在インストールされているCakePHP4のバージョンが4.0.1だったとしましょう。
2021年3月現在、CakePHP4の最新バージョンは4.2.4ですので一気に最新バージョンにアップデートしたい時などに利用するといいかと思います。

でも、一気にバージョン上げた時は入念に動作確認するようにして下さい。

composer requireでバージョン指定してパッケージをアップデート

バージョンを指定してアップデートすることも可能です。
予想がつくかもしれませんが、こんなコマンドになります。

$ composer require cakephp/cakephp:4.2.4

お気づきの方もいるかもしれませんが、上記コマンドはバージョン指定してパッケージを新規インストールするコマンドと同一です。

これには理由がありまして。
本来composer requireコマンドというものは、composer.jsonの中に記載のある「require」セクションに対して追加、または更新をかけるコマンドなのです。
ですので、既にcomposer.jsonのrequireセクション内に記載があるパッケージであればアップデートし、存在していなければ追加するという動きになります。

これが雰囲気でComposerをわかった気になっている人がわかってない部分です。
ここさえわかっていれば、composer.jsonを手動で書き換えてcomposer updateするとかする必要ないとわかるはずです。

composer remove

新規インストールと更新を説明したので、ついでに削除も書いておきます。
composer removeというコマンドはインストール済みのパッケージを削除するコマンドです。
TCPDFをインストールしたけど、やっぱり使わないことにした!というような場合は以下のコマンドを。

$ composer remove tecnickcom/tcpdf

このコマンドを実行するとcomposer.jsonからもcomposer.lockからも対象パッケージの記載が削除されています。
うっかり消してしまった場合は、またcomposer requireを使ってインストールすれば大丈夫です。

まとめ

時々聞くのが「composer installとcomposer updateの使い分けがわからない」なのですが、そもそも使い分けも何も比べる対象ではありません。
「composer updateとcomposer requireの使い分けがわからない」ならまだわかります。
ですが、本記事に説明を書いたのできっと大丈夫だと思います。多分。

本当は他にもComposerのコマンドはあるのですが、そうそう使う機会もありませんので必要になったらGoogle先生に聞いてみて下さい。

少々雑でしたが、Composerの使い方は以上になります。
お疲れ様でした。

環境構築カテゴリの最新記事