Memo

メモ > サーバ > 各論: プログラミング > PHPでComposerを使う

PHPでComposerを使う
PHPの依存性管理ツール。 依存ライブラリ郡も含めて、まとめてインストールできる。
composer require 使いたいライブラリ
もしくは、composer.json に使いたいライブラリを記述して
composer install
とコマンドを実行するとインストールされる。 自分で一つ一つ依存ライブラリをダウンロードする必要が無い。 ダウンロードしたファイルは vendor フォルダ内に格納される。 PHP開発でComposerを使わないなんてありえない!基礎編 - Qiita http://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94 Laravel5のプロジェクトをGitで管理する - Qiita https://qiita.com/zaburo/items/bc448a9fbf2d35194302 php - vendorディレクトリをGit管理下に置かないのは何故? - スタック・オーバーフロー https://ja.stackoverflow.com/questions/23725/vendor%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%... CentOS7にComposerをインストールする - Qiita https://qiita.com/inakadegaebal/items/d370bcb1627fce2b5cd1 Composer を CentOS にインストールする手順 | WEB ARCH LABO https://weblabo.oscasierra.net/php-composer-centos-install/ PHPパッケージ管理ツール「Composer」の処理の仕組みを見てみよう! (1/4)|CodeZine(コードジン) https://codezine.jp/article/detail/20455 ■インストール
# 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');" # php composer.phar
ハッシュの値はバージョンによって異なるため、最新の手順は以下で確認する https://getcomposer.org/download/ この際、
All settings correct for using Composer Unable to create Composer home directory "/usr/share/httpd/.config/composer": mkdir(): Permission denied
と表示されるなら、rootで以下を実行しておく。(もしくは apache を所有者とするディレクトリを作成するか。)
# cd /usr/share/httpd # mkdir .config # cd .config # mkdir composer # chmod 0777 composer
Composerをどこからでも呼び出せるようにする場合、以下も実行する。
# mv composer.phar /usr/local/bin/composer
以下のように、パスも拡張子も無しで呼び出せる。
# composer
■コマンド例 バージョンを表示。(Composerの動作確認。)
$ composer
ライブラリのインストール。(Goutteをインストールする場合。)
$ composer require fabpot/goutte
各ライブラリを最新に更新。(プログラムの動作に影響する可能性があるので慎重に。)
$ composer update
composer.json に書かれたライブラリとバージョンに従って更新。(他環境で更新された場合など。)
$ composer install
以下のようにすると、開発用ツールを除いてインストールされる。(本番環境などでは、この方法でインストールするといい。)
$ composer install --no-dev
インストールに失敗して原因が不明な場合、以下のように composer.lock を退避してから実行すれば成功することがある。(ただし恐らく非推奨。)
$ mv composer.lock composer.20200513.lock $ composer install --no-dev
「--no-dev」の指定については、以下などが参考になる。 【Laravel】composer require-devの開発、本番での切り分け - Qiita https://qiita.com/k-kurikuri/items/8e644b3338d8759d64fd PHP |【パッケージ管理】Composerの使い方 - わくわくBank https://www.wakuwakubank.com/posts/415-php-composer/ ■オートローディング 名前空間に従って自動的にファイルを読み込む。 require_once などで明示的にファイルを読み込む必要がない。 Composerを使うことで簡単に導入できる。 PHPでクラスをspl_autoload_registerを使ってオートロードする - バカンス駆動開発 http://egapool.hatenablog.com/entry/2013/11/17/195045 PHPのオートロード(autoload) - Qiita http://qiita.com/atwata/items/5ba72d3d881a81227c2a src/Refirio/Greeting/Hello.php
<?php class Hello { function say() { echo 'Hello World!'; } }
sample.php
<?php require_once "src/Refirio/Greeting/Hello.php"; $hello = new Hello(); echo $hello->say();
↓オートロードに対応させる。 composer.json
{ "autoload": { "psr-4": { "myapp\\": "src/" } } }
$ composer install … composer.json に設定した内容に合わせて vender ディレクトリ内にプログラムが作られる
以下のようにしてオートロードを利用できる。 src/Refirio/Greeting/Hello.php
<?php namespace myapp\Refirio\Greeting; class Hello { function say() { echo 'Hello World!'; } }
sample.php
<?php require_once "vendor/autoload.php"; $hello = new myapp\Refirio\Greeting\Hello(); echo $hello->say();
↓名前空間のエイリアスを作成。
<?php require_once "vendor/autoload.php"; use myapp\Refirio\Greeting\Hello; //use myapp\Refirio\Greeting\Hello as Hello; // クラスに別名を指定する場合 $hello = new Hello(); echo $hello->say();
■require 新しいパッケージを追加する。
$ composer require fabpot/goutte
vendor 内に諸々のプログラムがインストールされる。 また、composer.json が以下のように変更される。 composer.json
{ "autoload": { "psr-4": { "myapp\\": "src/" } }, "require": { "fabpot/goutte": "^4.0" } }
goutteが追加されたことを確認。 sample.php
<?php require_once 'vendor/autoload.php'; $client = new Goutte\Client(); $crawler = $client->request('GET', 'http://refirio.org/'); $tr = $crawler->filter('ul li')->each(function($element){ echo $element->text()."\n"; });
なお、以下のようにインストールできるパッケージがあったとして、
$ composer require xxx/yyy
以下のようにすることでバージョンを指定してインストールできる。
$ composer require xxx/yyy:"4.1.2"
■install composer.lockに書かれている各ライブラリをインストールする。
$ composer install
vendor 内に諸々のプログラムがインストールされる。 ■update composer.jsonをもとに各ファイルを最新版にアップデートする。
$ composer update
■composer.json の指定
$ COMPOSER=composer-default.json composer install
とすると、composer.json と composer.lock ではなく。 composer-default.json と composer-default.lock をもとにインストールが行われる。 以下、検証した内容。 composer.json と composer.lock のコピーを、それぞれ。 composer-default.json と composer-default.lock として作成する。 つまり goutte をインストールできる状態。
$ composer require monolog/monolog
monologが追加されたことを確認。 sample.php
<?php require_once 'vendor/autoload.php'; use \Monolog\Logger; use \Monolog\Handler\StreamHandler; // ロガー作成 $logger = new Logger('sample'); $logger->pushHandler(new StreamHandler('logs/sample.log', Logger::INFO)); // INFOログ出力 $logger->info('情報ログ'); echo "OK\n";
vendor を削除し、再度以下を実行する。
$ composer install
goutte と monolog がインストールされる。 つまり vendor がなくても composer.json と composer.lock によって環境を再現できた。 vendor を削除し、今度は以下を実行する。
$ COMPOSER=composer-default.json composer install
goutte だけがインストールされる。 monolog はインストールされない。 つまり composer-default.json を指定してインストールできた。 追加で以下を実行する。
$ composer install
monolog が追加インストールされた。 ■create-project でプロジェクト作成
$ composer create-project ethna/ethna-project
によって、以下が実行されているみたい。
$ git clone https://github.com/ethna/ethna-project.git $ cd ethna-project $ composer install
Composerのcreate-projectが何をやっているのか調べてみた - Qiita https://qiita.com/DQNEO/items/74f4bb8fe447e4582a97 ただし自作のリポジトリで create-project をしようとすると以下のエラーになった。 また詳細を確認したい。
$ composer create-project https://github.com/refirio/laravel6 test Creating a "https://github.com/refirio/laravel6" project at "./test" [UnexpectedValueException] Could not parse version constraint //github.com/refirio/laravel6: Invalid version string "//github.com/refirio/laravel6"
■補足 vendor フォルダは通常、gitの管理対象外とする。 インストールしたライブラリの情報は composer.json と composer.lock に記録され、 「composer install」を実行すると同じバージョンのライブラリをダウンロードしてくれる。 つまり、他の環境でも同じ状態を再現できる。 ただし運用方法によっては、vendor をgit管理対象にするのも有効(コマンドラインでの操作が難しい開発メンバーが多い、など。) メリット&デメリットを考える。 XAMPP環境にインストールする手順は XAMPP.txt を参照。

Advertisement