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