【第0回】Composerを使ってお手軽アプリケーション開発
ComposerはSymfonyやLaravelなどのPHP製フレームワークも対応しているPHPのパッケージ管理システムです。
本連載ではComposerで公開されているパッケージの中から、フレームワークを問わず汎用的に使えるライブラリをサンプルコードと共に紹介します。
連載初回となる今回はComposerの導入として、パッケージ管理システムの説明やComposerのインストール方法や基本的な使い方を解説していきます。
パッケージ管理システム「Composer」とは?
パッケージ管理システムは、公開されているソースコードを簡単に取得・実行するためのツールです。
GitHubなどに公開されているOSS(オープン・ソース・ソフトウエア)のライブラリが登録されています。
Composerを使用するメリット
Composerを利用すると、主に下記3つのメリットがあります
- 使用しているパッケージをファイルで管理できる
- パッケージの依存関係を解消してくれる
- オートローダーが内蔵されている
使用しているパッケージをファイルで管理できる
Composerでは、composer.jsonというファイルで使用しているパッケージの情報を管理しており、取得したパッケージ名とバージョン情報などが格納されています。
この情報がパッケージ管理システムでは重要となり、自分でパッケージを取得してくる場合に比べて、大きなメリットが存在します。
例えば、パッケージを取得したあとに、パッケージにバグや脆弱性が発覚し作成者がパッケージを更新することがあります。
自分でダウンロードしてきたパッケージだと、定期的に公開元を巡回して、再取得するという作業が必要ですが、Composerで取得してきたパッケージなら、updateコマンドを実行するだけで、使用しているすべてのパッケージの更新を確認し、更新がある場合は再取得してソースコードを最新の状態に保ってくれます。
また、開発時のみ使用するパッケージを分けて管理することができるため、テストツールなど本番で運用時に不要なパッケージはデプロイ対象から除外するようなことも簡単に行えます。
下記はアプリケーションで日付操作に便利なパッケージCarbonを使用し、開発環境でのみユニットテストツールのPHPUnitを使用する場合のcomposer.jsonファイルです。
{
"require": {
"nesbot/carbon": "^1.33"
},
"require-dev": {
"phpunit/phpunit": "^7.3"
}
}
requireの欄にCarbonのパッケージが書かれており、require-devの欄にPHPUnitのパッケージが書かれていることがわかると思います。
また、バージョンの記載が^1.33のように^(キャレット)が含まれていると思います。
これは、1.33.0以上 2.0.0未満のバージョンであれば、アップデートしてOKという意味を持っていて、実際にインストールされたバージョンは1.33.0(※2018/8/24時点)でした。
バージョンの表記には他にも~1.33(チルダ)や1.*(アスタリスク)を使った書き方もあり、同じ意味を持つものでもパッケージによって書き方が異なる場合もあります。
バージョン番号の付け方はセマンティックバージョニングという考え方に則って付けられているので、興味があるかたは調べてみてください。
パッケージの依存関係を解消してくれる
Composerで取得するパッケージには取得したファイルの中に必ずcomposer.jsonが含まれています。
パッケージの中のcomposer.jsonには、パッケージ名や作成者の情報などが含まれていますが、それ以外にも依存関係があるパッケージの情報が書かれています。
依存関係とはそのパッケージを使うために必要な別のパッケージのことで、Composerで公開されているパッケージの多くは別のパッケージに依存しています。
下記は先ほど取り上げたCarbonのパッケージ内のcomposer.jsonの一部を抜粋したものです。
{
"name": "nesbot/carbon",
"type": "library",
"description": "A simple API extension for DateTime.",
/* 中略 */
"require": {
"php": ">=5.3.9",
"symfony/translation": "~2.6 || ~3.0 || ~4.0"
},
/* 中略 */
}
https://github.com/briannesbitt/Carbon/blob/master/composer.json
上記で説明したとおり、Carbonのパッケージも他のパッケージ(symfony/translation)に依存していることがわかりました。
しかし、Composerを使ってパッケージをインストールした場合、依存しているパッケージも自動的に取得してくれるので、Carbonだけをインストールすれば使える状態になり、これが「依存関係を解消する」ということです。
もちろん、updateのコマンドを実行した時は依存先のパッケージも更新してくれます。
オートローダーが内蔵されている
本来のパッケージ管理システムとは別物ですが、ComposerにはPHPのオートローダが内蔵されており、Composerで取得したパッケージはもちろん、パッケージ管理外のファイルもオートロードの対象に含めることができます。
オートロードの方法もPSR-4だけでなくPSR-0、Classmap、Filesなどオートローダとしての機能も強力なので、Composerのオートロード機能だけを使うといった使い方も考えられます。
下記はPSR-4のオートロードをする時のサンプルです。
オートロードの項目を修正したあとは、dump-autoloadコマンドを実行して、autoload.phpを更新しないと認識されないので気をつけてください。
{
"autoload": {
"psr-4": {
"Hoge\\": "Hoge/"
}
}
}
Hoge/Foo/Bar.phpのファイル名で下記のようなクラスを定義すれば、オートロードでクラスの使用時にクラスが読み込まれます。
<?php
namespace Hoge\Foo;
class Bar
{
public function hello()
{
echo 'Hello, World!';
}
}
Composerのインストール方法
Composerの必要要件はPHP5.3.2以上なので、最近の環境であればほぼインストールすることが出来ます。
PHPがインストールされていれば、LinuxやMacはもちろん、Windowsでも利用することが可能です。
WindowsにComposerをインストールする
Windows向けにインストーラが用意されているので、簡単です。
下記URLの"Composer-Setup.exe"のリンクをクリックするとインストーラがダウンロードできます。
https://getcomposer.org/download/
Linux/MacにComposerをインストールする
ローカルインストール
ローカルインストールとは自分のホームディレクトリ配下にcomposerをインストールすることで、root権限がなくてもインストールすることができます。
この例では~/bin配下にインストールをするので、事前に~/binに対してパスを通しておいてください。
# ホームディレクトリに移動 (作業ディレクトリはお好みで)
cd ~
# インストーラを取得
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;"
# Composerのインストール (install-dirはお好みで変えてください)
php composer-setup.php --install-dir=bin --filename=composer
# インストーラの削除
php -r "unlink('composer-setup.php');"
グローバルインストール
グローバルインストールはroot権限が必要ですが、インストールすればどのユーザーでもComposerを利用することができます。
基本的にインストールディレクトリを変えれば、ローカルインストールと同じ手順でインストールすることができます。
# ホームディレクトリに移動 (作業ディレクトリはお好みで)
cd ~
# インストーラを取得
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;"
# Composerのインストール (sudo権限が必要です)
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
# インストーラの削除
php -r "unlink('composer-setup.php');"
インストールが終わったら
コマンドラインでcomposerと入力して実行してみましょう。正しくインストールされていれば、下記画像のような出力が表示されます。
composer: command not foundのように表示される場合は、パスが通っていないか、正しくインストールされていません。
パッケージの取得方法
Composerがインストールできたら、いよいよComposerでパッケージをインストールしましょう。
パッケージは一般的にプロジェクトごとにプロジェクトの作業ディレクトリにインストールします。
パッケージのインストール
パッケージのインストールにはrequireコマンドを使用します。
composer require [パッケージ名]と実行すると、パッケージの依存関係を含めて必要なパッケージを一括インストールしてくれます。
ここで、実際に日付操作に便利なパッケージのCarbonをインストールしてみましょう。
プロジェクトのルートディレクトリに移動して、composer require nesbot/carbonのコマンドを実行してみてください。
インストールが終わると、2つのファイルcomposer.json、composer.lockと1つのディレクトリvenderが作成されたと思います。
Composerで取得してきたソースコードはvenderディレクトリ内に保存されます。
パッケージを使用したい場合はvender/autoload.phpというファイルだけインクルードすれば、Composerで取得したすべてのパッケージが利用できるようになります。
下記はCarbonを使用して、現在の時刻を表示するサンプルです。
Carbonの詳しい使い方については、次回の記事で取り上げます。
<?php
require_once 'vendor/autoload.php';
use Carbon\Carbon;
// 出力結果:2018/08/24 19:45:52
echo Carbon::now()->format('Y/m/d H:i:s');
パッケージの更新(アップデート)
一度取得したパッケージを最新の状態にアップデートするにはcomposer updateを実行します。
updateコマンドではcomposer.jsonの情報を読み取ってパッケージをアップデートしてくれます。
特定のパッケージのみをアップデートしたい場合はインストールと同じようにcomposer update [パッケージ名]を実行します。
パッケージの削除
一度取得したパッケージを削除する場合はremoveコマンドを使用します。
composer remove [パッケージ名]を実行すると、指定したパッケージが削除され、composer.jsonからもパッケージの管理情報が消えます。
インストールしたすべてのパッケージを削除しても、composer.jsonなどのファイルは削除されないので、関連するファイルを完全に削除したい場合は手動で削除する必要があります。
別の環境で同じバージョンのパッケージを取得する
パッケージをインストールしたときに、composer.lockというファイルができたと思います。
ファイルを開いてみるとわかると思いますが、composer.json同様JSON形式のファイルになっています。
composer.lockには詳細なバージョン情報が記録されており、gitのコミットハッシュなど取得ソースを特定できる情報が含まれており、別の環境でcomposer installを実行するとcomposer.lockを生成しした環境と同じソースを取得できるというわけです。
requireやupdateは開発環境で実行して、同じソースコードを本番環境でも使用したいというときに大変便利です。
細かいバージョンの違いによるバグを防ぐことができるので、composer.lockも必ずバージョン管理に含めておきましょう。
まとめ
ここまで、Composerの概要とインストール方法、簡単な使い方を説明してきました。
ここで紹介していないコマンドもたくさんあるので、知りたい方はドキュメントなどを読んでみてください。
次回からは、Composerでインストールできるパッケージの紹介を行っていきます。
文末コラム:Composerの由来
Composerは作曲者という意味ですが、ロゴは指揮者のアイコンになっています。
以前、Composerの開発者であるJordi Boggiano氏が日本に来日した際に、このように答えています。
Q: composerの単語の意味は作曲者なのに、ロゴが指揮者なのは何故なの?
A: さほど深い理由はないけど、Google画像検索で調べても、割と指揮者が出てくるし、まあいいんじゃないの。。
とのこと