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ファイルの有無で挙動が変わるんです、このコマンド。
- composer.lockが存在する場合
composer.lockに記載されたバージョンでパッケージをインストールする。 - 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は以下のような時に使用します。
- パッケージを追加する場合
- インストール済みのパッケージをバージョンアップする場合
追加はわかるけど、何で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の使い方は以上になります。
お疲れ様でした。