composerを使ってパッケージをインストールする時に、requireとinstallとupdateがあります。
どれもインストールするのですがそれぞれで挙動が異なります。認識していないと意図しないパッケージやバージョンをインストールしてしまう可能性があります。
composer require, install, updateの違いまとめ
composer require, install, updateの違いは大きく2つです。
- どのバージョンをインストールするか?
- 依存関係をインストールするか?
コマンド | 内容 | 使用環境 |
---|---|---|
composer require パッケージ名 | ・指定したパッケージをインストール。 ・依存関係もインストールする。 ・composer.jsonに追記 ・composer.lockに追記 | 開発環境 |
composer update composer update パッケージ名 | ・最新バージョンをインストール。 ・依存関係もインストール。 ・composer.jsonに記述されているパッケージをインストール。 ・composer.lockに追記 | 開発環境 |
composer install composer install パッケージ名 | ・指定したバージョンでインストール。 ・composer.jsonに記述されているパッケージを ・composer.lockに記載されているバージョンでインストール | 本番環境 |
基本的に使うのは、初回インストール時はcomposer require
。それ以外はcomposer install
です。
composer update
を使うとバージョンが変わる可能性があるので注意が必要です。
composer.jsonとcomposer.lockの違い
composerでパッケージをインストールすると、composer.jsonとcomposer.lockにパッケージの情報がインストールされます。
composer.jsonとは?
composer.jsonはインストールしたパッケージ名と許容するバージョンを記載するファイルです。プロジェクトにインストールしたメインのパッケージ名です。
ファイルの中身はシンプルです。
追加したいパッケージやバージョンの指定を自分で編集することもできます。
バージョン指定の例
"require": {
"php": "^7.3|^8.0",
"fideloper/proxy": "^4.4",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^8.12",
"laravel/tinker": "^2.5",
"laravelium/sitemap": "^8.0",
"olssonm/l5-very-basic-auth": "^6.4",
"symfony/dom-crawler": "^5.3"
},
"require-dev": {
"facade/ignition": "^2.5",
"fakerphp/faker": "^1.9.1",
"mockery/mockery": "^1.4.2",
"nunomaduro/collision": "^5.0",
"phpunit/phpunit": "^9.3.3"
},
requireに全ての環境で使用するパッケージを記載します。
require-devは開発環境でのみ使用するパッケージを記載します。
バージョンの指定方法は様々ありますが、例えば ^7.0.1
であれば、一番左端のメジャーバージョンを固定し、マイナーバージョンとパッチは最新をインストールする指示です。
autoloadのように、実行時の設定を記述する場合もあります。
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
],
"autoload": {
"files": [
"app/Helpers/ViewHelper.php",
"app/Helpers/JsonLdHelper.php"
],
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
(省略)
}
composer.lockとは?
composer.lockは依存関係も含めて実際にインストールしたパッケージの詳細情報を記載したファイルです。
パッケージ名、バージョン、ソース、説明、ライセンスなど様々な情報が記載されています(パッケージにより情報の量は異なります)
拡張子がlockとなっているように、基本的に自分で編集することはありません。
requireかupdateコマンドによってのみ編集されます。
(省略)
{
"name": "laravel/tinker",
"version": "v2.6.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/tinker.git",
"reference": "04ad32c1a3328081097a181875733fa51f402083"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/tinker/zipball/04ad32c1a3328081097a181875733fa51f402083",
"reference": "04ad32c1a3328081097a181875733fa51f402083",
"shasum": ""
},
"require": {
"illuminate/console": "^6.0|^7.0|^8.0",
"illuminate/contracts": "^6.0|^7.0|^8.0",
"illuminate/support": "^6.0|^7.0|^8.0",
"php": "^7.2.5|^8.0",
"psy/psysh": "^0.10.4",
"symfony/var-dumper": "^4.3.4|^5.0"
},
"require-dev": {
"mockery/mockery": "~1.3.3|^1.4.2",
"phpunit/phpunit": "^8.5.8|^9.3.3"
},
"suggest": {
"illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0)."
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.x-dev"
},
"laravel": {
"providers": [
"Laravel\\Tinker\\TinkerServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Laravel\\Tinker\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
}
],
"description": "Powerful REPL for the Laravel framework.",
"keywords": [
"REPL",
"Tinker",
"laravel",
"psysh"
],
"time": "2021-03-02T16:53:12+00:00"
},
(省略)
本番環境はinstallのみ
本番環境でパッケージをインストールする時に使うのはcomposer install
のみです。
requireやupdateを使うと実行した時点での最新のバージョン(composer.jsonの指定範囲内)と最新の依存関係をインストールしてしまいます。
結果、開発環境と異なるバージョンがインストールされてしまうことになります。