PHPのパッケージ管理アプリComposer
ここではWindowsとDebianでのComposerのインストールの方法と、基本的な利用方法について書いています。
ComposerはPHPのパッケージ管理アプリです。パッケージとは機能を単位とするアプリやライブラリ群です。
自分で全てのコードを書く場合は必要がないですが、世に多く出回るパッケージを利用することでコードの省力化ができます。
パッケージの例を上げるとPHPからメールを送ることができるPHPMailerなどがあります。そのようなライブラリを利用する際に、Composerのコマンドを利用することで自作のコードと連携ができるようになります。
また、ひとつのパッケージが別のパッケージに依存しているという場合も、Composerが自動でその依存関係にあるパッケージをダウンロードしてくれます。
Windowsでインストール
Windows環境でインストールするには。ComposerのダウンロードページからWindows用のインストーラをダウンロードします。
インストラーに従い進めます。途中Setting Checkの箇所で、自分が利用しているPHPバイナリへのパスを求められます。その際、PATHに登録するか聞いてきますのでPATHに含めておきます。
もしプロキシを利用しているようなら、そのあとのプロキシの設定も環境に合わせて入力します。
Debianでインストール
Debianの方がWindowsよりも簡単です。DebianにはDebianのパッケージ管理アプリであるaptがありますので、それを利用してインストールすることができます。
$ su - ... # apt update ... # apt install composer ...
JSON
ComposerはJSONファイルによってコントロールされるので、先にJSONファイルについて簡単に説明しておきます。
詳しくはWikipedia:JavaScript Object Notationに載っていますが、JSONはJavaScript Object Notationの頭文字からとった言葉で、データの表記方法です。
Jsonファイルに含められるデータは次の通りです。
- オブジェクト
キーと値の組み合わせです。{ "Subject" : "How to JSON", "Price" : 1800 }といった風に、{}で囲み、:(コロン)で対を作り、,(カンマ)で区切ります。
- 配列
["abc",123,true]というふうに、[]で囲み、,(カンマ)で区切ります。
- 数値
10進数の整数と浮動小数点数が利用できます。指数表記は1.234e+1のように記述します。この時eは大文字のEでもいいです。
- 文字列
常に"(ダブルクォーテーション)で囲います。エスケープにはバックスラッシュを使います。
- true,false,null
すべて小文字で表記します。
composer.json
Composerを制御するファイルはcomposer.jsonというファイル名になっています。ここにパッケージの依存関係やメタデータなどを記載します。
最もシンプルな書き方は次の通りです。nameというキーに、プロジェクトを作成するベンダー名/プロジェクト名(自分の名前とアプリ名)を記述します。requireに依存する外部のプロジェクト名をセットします。依存するプロジェクトがない場合は空のオブジェクト{}にしておきます。
{
"name":"own-vendor/own-project-name",
"require":{}
}
requireの中身を記述する際は、オブジェクトの中に、依存するベンダー名/プロジェクト名をキーにして、バージョンの条件をセットします。
バージョンはワイルドカード*をつかったり、「>=1.0 <1.1」等と入力して範囲を指定することもできます。
公式ページでサンプルとして記載されているmonologというログライブラリを使う場合のcomposer.jsonの記述は次のようになります。
{
"name":"own-vendor/own-project-name",
"require":{ "monolog/monolog":"1.0.*" }
}
comopser init
説明のためにここまでファイルを手書する前提で紹介しましたが、このファイルは「composer init」コマンドで対話的に作成するのが普通です。このダイアログの途中でファイルを自動で読み込むautoloadの設定も聞かれるので利用するようにしておきます。
>composer init
Welcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [vendor/composer]:
Description []:
Author [, n to skip]:
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []:
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]?
Search for a package: monolog/monolog
Enter the version constraint to require (or leave blank to use the latest version):
Using version ^2.3 for monolog/monolog
Search for a package:
Would you like to define your dev dependencies (require-dev) interactively [yes]? n
Add PSR-4 autoload mapping? Maps namespace "Vendor\Composer" to the entered relative path. [src/, n to skip]:
Do you confirm generation [yes]? yes
Would you like to install dependencies now [yes]? no
途中で、依存(dependencies)パッケージを聞かれるので名前を入力します。dev-dependenciesは開発時にのみ使う依存パッケージを設定しますが、ここでは設定していません。Add PSR-4 autoload mapping?で始まる行がオートローダの設定です。デフォルトである空白のまま進めれば同時にインストールされます。
依存パッケージの設定をまったくしない場合は、このあと紹介するrequireコマンドで必要なパッケージを追加しながらプロジェクトを作成していくことになると思います。
依存パッケージを設定した場合、最後にそれをインストールするか聞いてきます。通常はyesで問題ないですが、ここでは説明の為あえてnoにしました。
comopser install
さきほど初期化時に依存関係を設定しながらインストールしませんでした。この場合composer.jsonがあるだけで、その中に記述されているパッケージはインストールされていません。この状態はgitなどからプロジェクトをcloneした状態と似ています。
composer.jsonファイルがある状態で、それと同じ階層で「composer install」を実行すると、中に書かれたライブラリのインストールが始まります。
インストールが終わると「composer.lock」というファイルが作られます。これは他の開発環境と同期をとるためのファイルです。依存するパッケージや、そのバージョンを全く同じにする際に用いられます。
composer.jsonとcomposer.lockの両方がある場合にcomposer installを実行すると、composer.lockファイルの内容が優先されます。ただしこの時もcomposer.jsonファイルは必須です。ふたつの間に差がある場合は、警告がでます。
requireとupdate
新しいパッケージを追加したい場合は「composer require パッケージ名」とすることで可能です。また、requireコマンドはインストール済パッケージのバージョンを変更したい場合にも利用可能です。
composer.lockファイルがある状態で、依存パッケージを変更したい場合は、composer.jsonファイルを修正した後「composer update」コマンドを実行します。composer.jsonファイルの修正がcomposer.lockファイルに伝播します。
バージョン指定の方法
composer.lockに記述するバージョン指定の方法についてもう少し詳しく書きます。
先に紹介したものを含め、バージョンの書式には次のようなものがあります。
- ワイルドカード
*をワイルドカードとして利用できます。1.*とすると1系という表現になります。
- 比較演算子
!=、<、<=、>、>=、が使えます。=を使いたいときは演算子なしで記述します。
- and or
andはスペースで区切ります「">=1.5 <2.00"」といった感じになります。
orは||を利用します。「"1.8 || >2.5"」
- バージョン範囲
~(チルダ)を使うとバージョンの範囲を指定できます。「"~2.3"」とすると2.3以上から指定されたメジャーバージョン(2)が変わらないところまで許容されます。「"~2.34"」とするとマイナーバージョン(3)が変わらないところまで許容されます。
^(キャレット)を使うと、セマンティック バージョニングのルールに則り互換性のあるバージョンまでをアップデート可能にします。具体的にはメジャーバージョンが1以上の時はメジャーバージョンを上げる更新をせず、メジャーバージョンが0の時はマイナーバージョンを上げる更新をしません。
セマンティック・バージョニング2.0.0
バージョン内の数値にもセマンティック・バージョニング2.0.0というバージョン表記に関する規格があります。
これは簡単に説明すると、バージョンを「メジャー.マイナー.パッチ」と区切り、後方互換のない場合はメジャーバージョンを、ある場合はマイナーバージョンを、後方互換のあるバグ修正はパッチバージョンを増やすというものです。
vendorフォルダ
インストールが終わるとvendorというフォルダができます。実際にインストールされたパッケージはこのフォルダ以下に収められます。
vendorディレクトリの中にはautoload.phpというファイルがあり、「require __DIR__ .'/vendor/autoload.php';」とPHPファイルに記述することで必要なパッケージをロードできるようになっています。
名前空間
composerでインストールするライブラリには名前空間が設定されています。
クラスやメソッド名の衝突を防ぐための仕組みです。
PHPファイルの最初の表記で「namespace sample;」とする事で名前空間を設定できます。名前空間はバックスラッシュか¥で階層的に持たせることもできます。
利用する際は、samplie¥method()と名前空間を指定して記述する方法や、該当のファイルにも同じ名前空間を設定することでmethod()とそのまま利用することもできます。
また複数の階層にわかれる場合は、相対的に指定することも可能です。ちなみに読み出しでは¥から始めることで絶対指定を表します。
use
名前空間に別名を付けたり、特定の名前空間にあるクラス名を設定することで修飾のないシンプルな表記にすることができます。
useを使う場合は常に絶対パスを指定するルールとなっている為、先頭に¥はつけません。
use some¥name¥space as alias;
これでsome¥name¥spaceの代わりにaliasという別名を使うことができます。別名を使って関数を呼び出す際も先頭に¥はつけません。
別名を付けずにuseを記述するとインポートとなります。
use some¥name¥space;
というインポートの書式は
use some¥name¥space as space
とほぼ同義になります。
なおインポートではクラスの指定もできます。
use some¥name¥space¥class;
このようにクラス名まで指定すれば、そのクラスは名前空間なしで使えます。
この辺りの話は【PHP超入門】名前空間(namespace・use)についてがわかりやすかったです。ありがとうございます。
長くなりましたが、require autload.phpと、useを使ってcomposerでインストールしたライブラリを使うのが肝となります。
レポジトリ
他、どんなライブラリがあるかというのはPackagistで探すことができます。
また以前は、先のサイトへの接続が遅かったこともあり、日本にミラーhttps://packagist.jp/も存在します。
こちらを利用するには、次のコマンドで設定します。
元に戻すには、次のようにします。