Ground Sunlight

Windowsで作る - PHPプログラミングの開発環境

ユーザ用ツール

サイト用ツール


composer:1.9:phpswitch

文書の過去の版を表示しています。



Warning: Undefined array key "ol" in /home/soffice/y2sunlight.com/public_html/ground/lib/plugins/extlist/syntax.php on line 185

Warning: Undefined array key "num" in /home/soffice/y2sunlight.com/public_html/ground/lib/plugins/extlist/syntax.php on line 276

Warning: Undefined array key "num" in /home/soffice/y2sunlight.com/public_html/ground/lib/plugins/extlist/syntax.php on line 278

Warning: Undefined array key "ol" in /home/soffice/y2sunlight.com/public_html/ground/lib/plugins/extlist/syntax.php on line 185

Warning: Undefined array key "num" in /home/soffice/y2sunlight.com/public_html/ground/lib/plugins/extlist/syntax.php on line 276

Warning: Undefined array key "num" in /home/soffice/y2sunlight.com/public_html/ground/lib/plugins/extlist/syntax.php on line 278

Warning: Undefined array key "ol" in /home/soffice/y2sunlight.com/public_html/ground/lib/plugins/extlist/syntax.php on line 185

ComposerをPHPバージョンで使い分ける

Version 1.9.3

— y2sunlight 2020-03-05

Composer に戻る

「Windowsの開発環境下で各プロジェクト毎のPHPのバージョンを変えたい」と言う要求はよくあると思います。XAMPPを使っていれば複数のPHPバージョンをインストールでき、起動するApacheも簡単に変更できます。また、Eclipseでもプロジェクト毎に好きなバージョンのPHPを設置できます。このように、Windows上にPHPの開発環境作るだけなら特に難しいことはありません。

ところが、Composerに関しては少し事情が違ってきます。問題の本質は、ComposerがPHPスクリプトで実装されているという点です。PHPスクリプトなので当然のことですがPHPによって起動され、そのPHPは通常PATH環境変数上のものが起動されます。従って、Composerを使う場合、PHPのバージョンがPATH環境変数上のものに制限されるので、プロジェクトによってPHPのバージョンを変えるには多少の工夫が必要になります。

プロジェクト毎に環境変数を変える方法には、ScoopやChocolateyなどのWindows用のパッケージマネージャを使う方法も考えられますが、ここでは、あくまでもXAMPPとEclipseの使用を前提とした方法で実現してみたいと思います。また、ここではComposerがWinodwsインストーラを使用して自動インストールされている事を前提とします。

ComposerとPHPの関係

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である点に注目しておいて下さい。

composer.json
{
    "require": {
        "vlucas/phpdotenv": "^4.1"
    }
}

以上のことを踏まえて、ComposerでPHPのバージョンを使い分ける方法を考えてみたいと思います。


PHPのバージョンをエミュレートする方法

最初に思いつくのは「composer.jsonでPHPのバージョンを指定できないか?」という事です。勿論これは可能で、Composer.jsonに config.php を追加します。

composer.json
{
    "config": {
        "platform": {
            "php": "5.4.19"
        }
    }
}

上の例に合わせてphpdotenvをPHP5.3.19で取得する手順を以下に示します。(勿論、composer.jsonを直接編集しても問題ありません。この場合、手順1,2は不要です)

  1. composer.jsonが無い時は、'composer init'コマンドでcomposer.jsonを作ります。
    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>
  2. 'composer config'コマンドでplatform.phpを設定してPHPのバージョンをエミュレートします。
    C:\sandbox>composer config platform.php 5.4.19
  3. 'composer require vlucas/phpdotenv'を実行します。

実際の'composer require'の様子は以下のようになります。

D:\usr\workspace3\y2sunlight\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の内容です。

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を通しておく必要があります。


Composerを起動するPHPのバージョンを変更する方法

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" %*
  • [1行名] コメント
  • [2行名] 遅延環境変数の展開を無効にする
  • [3行目] PATH環境変数の通っているphp.exeでcomposer.pharを起動する(%~dp0 は composer.bat の存在するドライブ文字とパスを表す。上のに場合 C:\ProgramData\ComposerSetup\bin\ )

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" %*

変更箇所は3行目です。php.exeとcomposer.pharを絶対パスに変更します。この例ではPHPのバージョンを現在使用しているもの(7.2.8)から7.3.15に上げています。

Composer diag 以下を実行すると確かに動いていることが確認できます。

C:\>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: 57815BA2 7E54DC31 7ECC7CC5 573090D0  87719BA6 8F3BB723 4E5D42D0 84A14642
Dev Public Key Fingerprint: 4AC45767 E5EC2265 2F0C1167 CBBB8A2B  0C708369 153E328C AD90147D AFE50952
OK
Checking composer version: You are not running the latest stable version, run `composer self-update` to update (1.9.1 => 1.10.0)
Composer version: 1.9.1
PHP version: 7.3.15
PHP binary path: D:\usr\xampp7.3.15\php\php.exe

この方法では、composer.batをプロジェクトフォルダ内に保存することで分かり易くなります。また、この方法ではPATH環境変数が必要なくなります(Eclipseではphp.exeは絶対Path指定、Composer以外でPATHを使用していない場合)。但し、composer.batは絶対パスを含むので環境依存となり、プロジェクトメンバでこのファイルを共有する場合は、注意が必要です。

composer/1.9/phpswitch.1584060920.txt.gz · 最終更新: by y2sunlight