「Windowsの開発環境下で各プロジェクト毎のPHPのバージョンを変えたい」と言う要求はよくあると思います。XAMPPを使っていれば複数のPHPバージョンをインストールでき、起動するApacheも簡単に変更できます。また、Eclipseでもプロジェクト毎に好きなバージョンのPHPを設置できます。このように、Windows上にPHPの開発環境作るだけなら特に難しいことはありません。
ところが、Composerに関しては少し事情が違ってきます。問題の本質は、ComposerがPHPスクリプトで実装されているという点です。PHPスクリプトなので当然のことですがPHPによって起動され、そのPHPは通常PATH環境変数上のものが起動されます。従って、Composerを使う場合、PHPのバージョンがPATH環境変数上のものに制限されるので、プロジェクトによってPHPのバージョンを変えるには多少の工夫が必要になります。
プロジェクト毎にPHP環境を変える方法には、ScoopなどのWindows用パッケージマネージャを使う方法も考えられますが、ここでは、あくまでもXAMPPとEclipseの使用を想定した方法で実現してみたいと思います。また、ここではComposerがWinodwsインストーラを使用して自動インストールされている事を前提とします。
Composerがパッケージを検索する時、対象となるPHPのバージョンはComposerを実行したPHPのバージョンに一致します。例えば、PHP7.2.8の環境下で以下のコマンドを実行します。(phpdotenvは環境設定のファイル(.env)のPHP版です)
composer require vlucas/phpdotenv
実際の'composer require'の様子は以下のようになります。
C:\sandbox>composer require vlucas/phpdotenv Using version ^4.1 for vlucas/phpdotenv ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 3 installs, 0 updates, 0 removals - Installing symfony/polyfill-ctype (v1.14.0): Downloading (100%) - Installing phpoption/phpoption (1.7.2): Downloading (100%) - Installing vlucas/phpdotenv (v4.1.1): Downloading (100%) Writing lock file Generating autoload files
この時、ComposerはPHP7.2.8を対象としたphpdotenvパッケージを探します。以下は、自動生成されたcomposer.jsonです。phpdotenvのバージョンが4.1である点に注目しておいて下さい。
{ "require": { "vlucas/phpdotenv": "^4.1" } }
以上のことを踏まえて、ComposerでPHPのバージョンを使い分ける方法を考えてみたいと思います。
最初に思いつくのは「composer.jsonでPHPのバージョンを指定できないか?」という事です。勿論これは可能で、Composer.jsonに config.php を追加します。
{ "config": { "platform": { "php": "5.4.19" } } }
上の例に合わせてphpdotenvをPHP5.3.19で取得する手順を以下に示します。(勿論、composer.jsonを直接編集しても問題ありません。この場合、手順1,2は不要です)
C:\sandbox>composer init Welcome to the Composer config generator This command will guide you through creating your composer.json config. Package name (<vendor>/<name>) [sunlight/sandbox]: Description []: Author [y2sunlight <iwata@soffice.biz>, n to skip]: n 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]? n Would you like to define your dev dependencies (require-dev) interactively [yes]? n { "name": "sunlight/sandbox", "require": {} } Do you confirm generation [yes]? C:\sandbox>
C:\sandbox>composer config platform.php 5.4.19
実際の'composer require'の様子は以下のようになります。
C:\sandbox>composer require vlucas/phpdotenv Using version ^3.6 for vlucas/phpdotenv ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 3 installs, 0 updates, 0 removals - Installing symfony/polyfill-ctype (v1.14.0): Loading from cache - Installing phpoption/phpoption (1.5.3): Downloading (100%) - Installing vlucas/phpdotenv (v3.6.0): Downloading (100%) Writing lock file Generating autoload files
この時、ComposerはPHP5.4.19を対象としたphpdotenvパッケージを探します。以下が、composer.jsonの内容です。
{ "name": "sunlight/sandbox", "require": { "vlucas/phpdotenv": "^3.6" }, "config": { "platform": { "php": "5.4.19" } } }
このようにPHP5.4.19を指定した場合、phpdotenvのバージョンが(PHP7.2.8を対象とした4.1ではなくて)3.6になっています。
この方法でComposerをPHPバージョンで使い分けるによる方法の利点は、IED(Eclipse)で設定しているPHPのバージョンと同じものをcomposer.jsonで指定するだけで良く、設定が非常に分かり易い点です。但し、php.exeとcomposer.batをPATH環境変数に設定しておく必要があります。
Windows環境下では、composerコマンドはバッチファイル(composer.bat)です。Windowsのインスト―ラーでComposerをインストールした場合、このバッチファイルは以下の場所にあります。
C:\ProgramData\ComposerSetup\bin\composer.bat
@echo OFF :: in case DelayedExpansion is on and a path contains ! setlocal DISABLEDELAYEDEXPANSION php "%~dp0composer.phar" %*
composer.batで何が起こっているか分かれば話は簡単です。インストールされているcomposer.pharはこのまま使う事にして、composer.batだけをプロジェクトフォルダ(composer.jsonと同じフォルダ)にコピーしてcomposer.batを以下のように変更します。
{Project Folder}\composer.bat
@echo OFF :: in case DelayedExpansion is on and a path contains ! setlocal DISABLEDELAYEDEXPANSION D:\usr\xampp7.3.15\php\php "C:\ProgramData\ComposerSetup\bin\composer.phar" %*
変更箇所は4行目です。php.exeとcomposer.pharを絶対パスに変更します。この例ではPHPのバージョンを現在使用しているもの(7.2.8)から7.3.15に上げています。
Composer diag 以下を実行すると確かに動いていることが確認できます。
C:\sandbox>composer diag Checking platform settings: OK Checking git settings: OK Checking http connectivity to packagist: OK Checking https connectivity to packagist: OK Checking github.com rate limit: OK Checking disk free space: OK Checking pubkeys: Tags Public Key Fingerprint: ******** Dev Public Key Fingerprint: ******** OK Composer version: 1.9.3 PHP version: 7.3.15 PHP binary path: D:\usr\xampp7.3.15\php\php.exe
この方法では、composer.batをプロジェクトに取り込んでいるので既定のPHPバージョンを意識する必要が無く、PATH環境変数も必要ありません(Eclipseもphp.exeは絶対Path指定、Composer以外でPATHを使用していない場合php.exeのPATHは不要になります)。但し、composer.batは絶対パスを含むので環境依存となり、プロジェクトメンバでこのファイルを共有する場合は注意が必要です。悩ましい限りです。