はじめに
composer install
とcomposer require
の違いから、なぜ、サーバーでパッケージを追加してはダメかについてまとめました。(自分の理解のために言語化したものです。ご指摘ありましたらコメント等で教えていただけますと幸いです)
環境
- Laravel8
参考にした記事
- composer.jsonとcomposer.lockの役割について分かりやすくまとめてみた
- composerのrequire/update/installの違い。開発環境と本番環境へのデプロイで使うコマンド
- [PHP]パッケージ管理ツールComposerを図で理解する :Qiita
Composerとは
Composerとは、PHPのパッケージ・ライブラリ管理ツールです。
composer.lockファイルとは
実際にダウンロードされたパッケージの情報が記録されるファイルです。バージョン名を記録されています。
composer.jsonファイルとは
プロジェクトの依存関係を記述したファイルで、導入したパッケージ等が記述されています。
composer installについて
最初にcomposer install
をしたとき、composer.jsonファイルを参照してパッケージやライブラリがvendorディレクトリ配下にまとめてインストールされます。
この時、同時にcomposer.lockファイルが生成されます。composer install
時に参照したパッケージやパッケージのバージョン情報がcomposer.lockに書き込まれます。
そして、二回目以降はcomposer installをしたときには、composer.lockファイルを参照します。
つまり、composer.lockファイルがある場合は、composer install
しても、パッケージの追加やバージョン情報とかが書き換わることがないのです。
チーム開発するときは、composer.lockファイルをGit管理してチーム間で共有すれば、チームでバージョン等を統一した状態で必要なパッケージをアプリにインストールすることができます。
(逆に、composer update
(composer.jsonに記録されているパッケージを最新バージョンにアップデート、composer.lockファイルも更新)やcomposer require
(パッケージを追加)をチームメンバーが各自で行ってしまうとチーム内でバージョンが異なってしまい、不具合が発生する元となります、、、!)
なぜサーバーでパッケージを追加してはダメなのか
上記にて説明した通り、サーバーでcomposer require
やcomposer update
を行い、パッケージの追加・アップデートを行ってしまうとローカル環境とパッケージのバージョンが変わってしまう場合があります。不具合が発生してしまいますね、、、
おわりに
composer install
とcomposer require
の違いが分からず、サーバーでパッケージを追加しようとしたり、各メンバーにcomposer require
をするよう促したりしてしまっていました(恐ろしい、、、)自分が何をやっているのかを理解して実行することが大切だと痛感しました。
おまけ
npmも同様な考え方とのことです!