新規のLaravelのプロジェクトを作成するときや、ライブラリを追加するときに使用するcomposerのコマンド。Laravelの陰で一見地味な存在に見えます。しかし、このおかげでphp言語のライブラリのインフラが整備され、アプリのモダンな開発の基盤を提供しているなくてはならないコマンドです。今回はこのコマンドに注目してみます。

composerのインストール

1回実行すれば何もしないのですっかり忘れていたけれど、以下が正しいインストール方法。これによると

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"

上を実行すると、composer.pharのファイルが作成されます。開発環境なら、自分のホームのbinのディレクトリに、グローバルで使用したいなら、ルート権限で以下のように適切なディレクトリへ移します。

$ mv composer.phar /usr/local/bin/composer

composer.pharの作成時には、ホームディレクトリに、.composerのディレクトリ(あるいは、.config/composer)が作成されます。

.composer
├── cache
├── keys.dev.pub
└── keys.tags.pub

今はほとんど空ですが、将来はすでにインストールしたパッケージのキャッシュやlaravelなどのコマンドの保存場所となります。

Laravelのパッケージのインストール

composerのコマンドが使えるようになったところで、laravelのパッケージをインストールします。

$ composer global require "laravel/installer"

globalのオプションは、ホームディレクトリの.composerのディレクトリにファイルをインストールすることを指定します。インストール後は、.composerのディレクトリは以下のような感じになります。

.composer
├── cache
│   ├── files
│   │   ├── guzzlehttp
│   │   ├── laravel
│   │   ├── psr
│   │   └── symfony
│   └── repo
│       └── https---repo.packagist.org
├── composer.json
├── composer.lock
├── keys.dev.pub
├── keys.tags.pub
└── vendor
    ├── autoload.php
    ├── bin
    │   └── laravel -> ../laravel/installer/laravel
    ├── composer
    ├── guzzlehttp
    ├── laravel
    │   └── installer
    ├── psr
    └── symfony

vendor/bin/laravelのコマンドに気づいたと思いますが、Laravelのプロジェクトの作成に使われるコマンドです。簡単に実行できるように、.bashrcなどのファイルにおいて、$PATHに、$HOME/.composer/vendor/binを追加しておいてください。

Laravelのプロジェクトの作成

ここまで来ると、プロジェクトの作成は簡単です。インストールしたいディレクトリへ行き以下を実行します。

$ laravel new new-project

注意が必要なのは、上のコマンドの実行では最新のLaravelのバージョン(今なら、5.7)がインストールされることです。

バージョンを指定したいなら、composerコマンドの登場です。

$ composer create-project --prefer-dist laravel/laravel new-project "5.5.*"

composerのオプション

新規のLaravelのプロジェクトを作成したところで、いったい何のパッケージがインストールされたのでしょう?
ホームディレクトリの.composerと同様に、vendorのディレクトリを見るとパッケージに対応していろいろなディレクトリが作成されています。

パッケージの情報をより見たいなら、

composer show

の実行です。

$ composer show
beyondcode/laravel-dump-server        1.2.1    Symfony Var-Dump Server for Laravel
dnoegel/php-xdg-base-dir              0.1      implementation of xdg base directory specification for php
doctrine/inflector                    v1.3.0   Common String Manipulations with regard to casing and singular/plural rules.
doctrine/instantiator                 1.1.0    A small, lightweight utility to instantiate objects in PHP without invoking their constructors
doctrine/lexer                        v1.0.1   Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.
dragonmantank/cron-expression         v2.2.0   CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due
egulias/email-validator               2.1.5    A library for validating emails against several RFCs
erusev/parsedown                      1.7.1    Parser for Markdown.
fideloper/proxy                       4.0.0    Set trusted proxies for Laravel
filp/whoops                           2.2.1    php error handling for cool kids
fzaninotto/faker                      v1.8.0   Faker is a PHP library that generates fake data for you.
hamcrest/hamcrest-php                 v2.0.0   This is the PHP port of Hamcrest Matchers
jakub-onderka/php-console-color       0.1     
jakub-onderka/php-console-highlighter v0.3.2  
laravel/framework                     v5.7.3   The Laravel Framework.
laravel/tinker                        v1.0.7   Powerful REPL for the Laravel framework.
...

他のパッケージをインストールしたいなら、例えば、スプレッドシートのライブラリをインストールしたいなら、

composer require "phpoffice/phpspreadsheet"

を実行します。

composer.jsonのファイルも更新されて、"phpoffice/phpspreadsheet": "^1.4"の行が追加されます。

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.7.*",
        "laravel/tinker": "^1.0",
        "phpoffice/phpspreadsheet": "^1.4"
    },
...

開発のみに使用するパッケージは、

composer require barryvdh/laravel-debugbar --dev

と、–devオプションをつけて実行します。実行後は、composer.jsonrequire-devセクションも以下のように更新されています。

...
    "require-dev": {
        "barryvdh/laravel-debugbar": "^3.2",
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^2.0",
        "phpunit/phpunit": "^7.0"
    },

...

手動でこのファイルを編集してパッケージを追加したときには、

composer update

を実行します。他のパッケージの更新やパッケージ間の依存のチェックもあり、時間がかかります。

上記のコマンドの実行で、composer.jsonが編集されることを見てきましたが、composer.lockというファイルも更新されます。このファイルは、プロジェクトのデプロイにおいて重要です。開発環境でテストされたプログラムと同じパッケージの同じパージョンを、本環境にプログラムをデプロイする必要あります。それには、

composer install

を本サイトで実行します。このコマンドは、composer.lockのデータに従って開発環境と同じパッケージの同じバージョンのファイルをインストールしてくれます。

さらに、

composer install --no-dev

と、–no-devオプションを付ければ、開発だけに必要なパッケージは一切インストールはしません。

composer.jsoncomposer.lockはそれゆえに、gitなどで必ずバージョン管理する必要があります。

By khino