PHPのライブラリ管理をしてくれるcomposerの使い方について、まとめてみました。
Composerとは?
ComposerはPHPの依存関係管理のためのツールです。それはあなたがあなたのプロジェクトが依存しているライブラリを宣言することを可能にし、それはあなたのためにそれらを管理(インストール/更新)します。
公式ページを翻訳機にかけたらこんな感じでした。
あのライブラリを使いたいけど、あのライブラリもその中で使われているから必要みたいな時に、一括で依存関係を解消してプロジェクトに追加してくれるようです。
認識としては、ライブラリの依存関係を気にせずにインストールできるツールでいいかと思います。
Composerを導入する
composerをダウンロードして、使うようにするまでを書いています。
composerのダウンロード方法は公式サイトにも書いていますが、こちらでも説明を記載してみました。
下記を順に実行するとcomposerを導入できます。
1. composer-setup.phpをダウンロード
最初にPHPコマンドを使用してPHPの実行ファイル(composer-setup.php)をダウンロードします。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
2. composer-setup.phpファイルのハッシュ値チェック
composer-setup.phpのファイルをダウンロードしたときにファイルが書き換わってないかチェックしています。
composerのバージョンが変わると、ここのハッシュ値も変わるのでInstaller corrupt
が出力された場合は、公式サイトを確認してください。
実行して、Installer verified
が出力されればOKです。
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
3. composer-setup.phpを使用して、composer.pharファイルを作成する
次にPHPコマンドを使って、composer-setup.phpを実行しcomposer.pharファイルを作成します。
php composer-setup.php
上記コマンドを実行すると、下記のように出力されて実行ディレクトリ配下にcomposer.phar
ファイルが作成されます
$ php composer-setup.php
All settings correct for using Composer
Downloading...
Composer (version 2.0.11) successfully installed to: /Users/hoge/composer.phar
Use it: php composer.phar
4. 不要になったcomposer-setup.phpファイルを削除する
composer-setup.phpは不要なので削除します。
php -r "unlink('composer-setup.php');"
5. composer.pharファイルの移動
上記までのコマンドを実行すると、composer.phar というファイルがコマンドを実行したディレクトリにできます。
php composer.phar
とすればcomposer
を使うことができますが、パスが通っている場所に移動すれば、phpコマンドを打たなくても使えます。
composerにリネームしてパスが通っている場所に移動しましょう。
Macの場合は/usr/local/bin
配下などになるかと思います。
mv composer.phar /usr/local/bin/composer
Composerを使ってみる
composerのそれぞれのコマンドについて記載しています。
composerでライブラリを入れてみる (composer requireについて)
新規でライブラリを入れるときはcomposer require
コマンドを使用します。
composer require パッケージ名
コマンドを使用すると、使用したディレクトリ配下にvendor
ディレクトリが作成されます。
また、composer.json
ファイルが作られて導入したライブラリが追記されていきます。
composer require
でライブラリを追加するたびに追記されていきます。
composer.lock
ファイルも作られて、ライブラリ導入した時点の情報がこのファイルに保持されます。
composer require
でライブラリを追加するたびに、こちらも更新されていきます。
例:Carbonライブラリをインストールして使う
例として、Carbonというライブラリを使う場合は下記になります。(時間処理を楽にできるPHPのライブラリです)
composer require nesbot/carbon
実行すると、必要なファイルがvender
配下にダウンロードされ展開されています。
composer.json
とcomposer.lock
も更新されます。
composer.json
は下記のようになります。
{
"require": {
"nesbot/carbon": "^2.45"
}
}
そのあとは下記のような感じで、autoload.phpを読んで処理を書いて行きます。
<?php
require 'vendor/autoload.php';
use Carbon\Carbon;
$dt = new Carbon();
echo $dt."\n";
composer requireが返ってこない
composer requireした後に、反応が全くなくて困ってしまいました😅
xdebugでリモートデバッグしたまま、composer requireコマンドを使うと止まったまま返ってこないような状態になるようです。
composer installについて
requireで取ってくるならinstallはどこで使うの?って思いますよね?
composer require
したときにcomposer.lock
ファイルができますが、これを元にインストールします。
composer.lock
がある場合はcomposer.lock
を元にします。
composer.lock
が存在しない場合はcomposer.json
ファイルにリストされているものをダウンロードします。
チームで同じコードをいじっていくときにvendor
は共有せずに、commposer.json, composer.lock
だけを共有すればメンバーが同じライブラリが使えます。
それぞれプロジェクトのメンバーは、コードをクローンしたあとにcomposer install
ですね。
下記の記事でもcomposer
を使用してライブラリを使ってみています。
composer updateについて
composer update
はcomposer.json
を元に各ライブラリを最新に更新するときに使います。
実行するとcomposer.lock
ファイルが更新されます。
composer removeについて
ライブラリを取り除いてくれるコマンドです。
composer remove パッケージ名
composer.json
からインストールしたライブラリ情報が削除され、composer.lock
も更新されます。
Composerで自作ライブラリを使いたい(自動読み込みしたい)
Composerの自動読み込み(オートロード)を使用する方法です。
名前空間を使ってないライブラリ(クラス)を読み込む
ComposerでPHPのライブラリを使用したい(自動読み込みしたい)場合は下記のように、composer.json
のautoload
項目に設定を追加します。
左に名前空間を書いて、右に読み込みたいコードのディレクトリを記載します。
{
"autoload": {
"psr-4": {
"" : "NoNameSpaceLibrary/"
}
}
}
上記はcomposer.json
が配置されているディレクトリと同じディレクトリにNoNameSpaceLibrary/
ディレクトリがある場合です。
上記のように書くと、自動読み込みしてくれます。
使うときにはvendor/autoload.php
を読み込むと、NoNameSpaceLibrary
ディレクトリ内のクラスがそのまま使えます。
下記はPeopleクラスがNoNameSpaceLibrary
ディレクトリに配置されていた場合です。
<?php
require_once 'vendor/autoload.php';
$people = new People();
$people->setName("taro");
$people->setAge(22);
echo "{$people->getName()}さんは、{$people->getAge()}歳です。\n";
名前空間を使用したライブラリ(クラス)を読み込む
先ほどと同じで、左に名前空間を書いて、右に読み込みたいコードのディレクトリを記載します。
左の名前空間は、読み込むディレクトリで使用している名前空間を描きます。
{
"autoload": {
"psr-4": {
"NameSpaceLibrary\\" : "NameSpaceLibrary/"
}
}
}
上記の設定はNameSpaceLibrary/
ディレクトリ配下に下記のようにクラスが存在する場合です。
<?php
namespace NameSpaceLibrary;
class Item {
// 省略
}
使うときは下記のようにvendor/autoload.php
を読み込んだ後に、名前空間をuse
して使用することができます。
<?php
require_once 'vendor/autoload.php';
use NameSpaceLibrary\Item;
$item = new Item();
$item->setName("banana");
$item->setPrice(120);
echo "{$item->getName()}は{$item->getPrice()}円です。\n";
composer require –devオプションについて
composerで--dev
オプションをつけて、requireコマンドを実行することができます。
これは開発環境でしか使わないライブラリをインストールするときに使います。
例えば、下記のようにコマンドを実行します。
composer require --dev michelf/php-markdown
これは開発環境用として、composer.json
に記録されます。
開いてみると下記のようになっています。
"require": {
"php": "^7.3|^8.0",
"fideloper/proxy": "^4.2",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^8.0",
"laravel/tinker": "^2.0",
"laravel/ui": "^3.3"
},
"require-dev": {
"facade/ignition": "^2.3.6",
"fzaninotto/faker": "^1.9.1",
"michelf/php-markdown": "^1.9", // コレ!!
"mockery/mockery": "^1.3.1",
"nunomaduro/collision": "^5.0",
"phpunit/phpunit": "^9.3"
},
“require-dev”に入っているものが、開発環境では追加でインストールされます。(”require”と”require-dev”のライブラリが入る)
開発環境では、通常通りcomposer install
でインストールします。
本番環境でインストールするとき
開発環境で環境を作る際には、--no-dev
を使います。
下記のようにすると、開発用のライブラリ(“require-dev”)に記載されているものはインストールされません。
composer install --no-dev
composerでインストールしたライブラリを確認したい
composerでインストールしたライブラリを確認するには、下記のコマンドを使用します。
composer show --installed
インストールしたパッケージがツラツラと出てきます。
対象のパッケージがインストールされているか確認する場合は、下記のようにgrepを組み合わせたりすると見やすいかと思います。
composer show --installed | grep facade/ignition
コメント