【Laravel】composer require, install, updateの違い|composer.jsonとcomposer.lockの違いと役割

laravel-prograshi(プロぐらし) Laravel
記事内に広告が含まれていることがあります。

composerを使ってパッケージをインストールする時に、requireとinstallとupdateがあります。

どれもインストールするのですがそれぞれで挙動が異なります。認識していないと意図しないパッケージやバージョンをインストールしてしまう可能性があります。

composer require, install, updateの違いまとめ

composer require, install, updateの違いは大きく2つです。

  1. どのバージョンをインストールするか?
  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となっているように、基本的に自分で編集することはありません

requireupdateコマンドによってのみ編集されます。

          (省略)
          {
            "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の指定範囲内)と最新の依存関係をインストールしてしまいます。

結果、開発環境と異なるバージョンがインストールされてしまうことになります。

タイトルとURLをコピーしました