【PHPライブラリ管理】Composerの使い方

PHP

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.jsoncomposer.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 updatecomposer.jsonを元に各ライブラリを最新に更新するときに使います。
実行するとcomposer.lockファイルが更新されます。

composer removeについて

ライブラリを取り除いてくれるコマンドです。

composer remove パッケージ名

composer.jsonからインストールしたライブラリ情報が削除され、composer.lockも更新されます。

Composerで自作ライブラリを使いたい(自動読み込みしたい)

Composerの自動読み込み(オートロード)を使用する方法です。

名前空間を使ってないライブラリ(クラス)を読み込む

ComposerでPHPのライブラリを使用したい(自動読み込みしたい)場合は下記のように、composer.jsonautoload項目に設定を追加します。
左に名前空間を書いて、右に読み込みたいコードのディレクトリを記載します。

{
    "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

コメント

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