【PHP】phpenvからvfoxへの乗り換え

PHP

複数バージョンのPHPを管理するツールとしてphpenvを使ってきましたが、このところアップデートの反映頻度が落ちてきて、現在PHP8.4の反映PRがマージされずに2カ月近く止まっている状態です。今後のアップデートも期待できそうにないため、vfoxへ乗り換えてみることにしました。

※2025/06/09追記: phpenv の更新がスピーディに実施されるようになったため、筆者は引き続き phpenv を使用しています。

vfox | The Multiple SDK Version Manager
The Multiple SDK Version Manager

phpenv用のPHPビルドツール php-build のメンテナーであるGraham Campbell氏のプロフィールでは、

「私は次の人気のあるリポジトリと組織のメンテナです。」

の一覧に php-build が入っていません。。

毎度アップデートのプルリクをしてくださる @mzch さんの努力は報われるのでしょうか?

Updated xdebug & Added 8.1.31, 8.2.26, 8.2.27, 8.3.14, 8.3.15, 8.4.1 and 8.4.2 by mzch ?? Pull Request #785 ?? php-build/php-build
Update xdebug version

vfoxとは

vfox | The Multiple SDK Version Manager
The Multiple SDK Version Manager

vfox は、クロスプラットフォームの拡張可能なバージョン マネージャーです。ネイティブ Windows と、もちろん Unix ライクをサポートします。これを使用すると、さまざまな環境をすばやくインストールして切り替えることができます。

すべてのツールのバージョン情報が .tool-versions という名前のファイルに保存されるため、この情報をプロジェクト内で共有して、チームの全員が同じツール バージョンを使用できるようにすることができます。

従来の作業では、それぞれ独自の API、設定ファイル、実装 ($PATH 操作、shim、環境変数など) を備えた複数の CLI バージョン マネージャーが必要です。 vfox は、開発ワークフローを簡素化するための単一のインタラクティブな方法と構成ファイルを提供し、シンプルなプラグイン インターフェイスを通じてすべてのツールとランタイム環境に拡張できます。

  • クロスプラットフォームサポート: Windows / Linux / macOS
  • すべての言語を管理するための一貫したコマンド
  • さまざまなプロジェクト、さまざまなシェルのさまざまなバージョンをグローバルにサポート。
  • 選択したランタイムのサポートを追加するシンプルなプラグイン システム
  • プロジェクト横断時にランタイムのバージョンを自動的に切替
  • 既存の構成ファイル .node-version、.nvmrc、.sdkmanrc のサポートによる簡単な移行
  • 一般的なシェル (Bash、ZSH、Powershell、Clink) で使用できるシェル補完
  • asdf-vm よりも高速で、よりシンプルなコマンドと真のクロスプラットフォーム統合を提供。 「asdf との比較」参照。

▼対応プラグインのリスト

vfox | The Multiple SDK Version Manager
The Multiple SDK Version Manager

vfox-php は公式プラグインです。

なぜvfoxなのか

asdfやmise等、他にも選択肢がいくつかありましたが、

簡便そうで、且つphpプラグインの最終更新日が新しいからです。

実際には使ってみて様子を見ないと何とも言えませんが。

もしダメなようであれば他ツールへの乗り換えもあり得ます。

前提条件

  • Ubuntu24.04(WSL2)上で作業しています
  • phpenvインストール済
  • phpenvのインストール先は「~/.phpenv」
  • 利用シェルはbash

※本記事は「使ってみた」レベルであり、動作保証するものではありません。

※vfoxのご利用は自己責任でお願いいたします。

phpenv無効化

phpenv無効化の前に、現状の確認をしておきます。

「~/.profile」内の次の5行をコメントアウト(または削除)します。

export PHPENV_ROOT="${HOME}/.phpenv"
if [ -d "${PHPENV_ROOT}" ]; then
    export PATH="${PHPENV_ROOT}/bin:${PATH}"
    eval "$(phpenv init -)"
fi

VSCodeやターミナルを一度全て閉じてからWSL2のUbuntuのターミナルを再起動します。

aptでインストールしたPHPが適用されており、

phpenvはコマンドが見つからない状態となっています。

phpenvが全く不要な場合は、

「~/.phpenv」をフォルダごと削除して構いません。

rm -rf ~/.phpenv

※筆者はしばらく様子を見たいので、削除せずに残しておきます。

vfoxインストール

vfoxは「/usr/local/bin」にインストールされます。

インストールにはsudoの権限が必要です。

yumやaptでインストールできますが、今回はシェルスクリプトでインストールします。

curl -sSL https://raw.githubusercontent.com/version-fox/vfox/main/install.sh | bash

インストール自体は瞬殺です。

続いてシェルへのフックを追加します。

echo 'eval "$(vfox activate bash)"' >> ~/.bashrc

現在のシェルに変更を反映します。

source ~/.bashrc

vfoxの環境変数が反映されています。

ちなみに、vfoxのhelpを見ると次のようになっています。

$ vfox --help
NAME:
   vfox - vfox is a tool for runtime version management.

USAGE:
   vfox [command] [command options]

VERSION:
   0.6.0

DESCRIPTION:
   vfox is a cross-platform version manager, extendable via plugins. It allows you to quickly install and switch between different environment you need via the command line.

COMMANDS:
   upgrade  upgrade vfox to the latest version
   config   Setup, view config
   cd       Launch a shell in the VFOX_HOME or SDK directory
   help, h  Shows a list of commands or help for one command
   Plugin:
     info       Show plugin info
     available  Show all available plugins
     update     Update specified plugin, use --all/-a to update all installed plugins
     remove     Remove a plugin
     add        Add a plugin or plugins
   SDK:
     install, i     Install a version of the target SDK
     current, c     Show current version of the target SDK
     use, u         Use a version of the target SDK
     list, ls       List all versions of the target SDK
     uninstall, un  Uninstall a version of the target SDK
     search         Search a version of the target SDK
     env            

GLOBAL OPTIONS:
   --debug            show debug information (default: false)
   --help, -h         show help
   --version, -v, -V  print version (default: false)

COPYRIGHT:
   Copyright 2024 Han Li. All rights reserved.

phpプラグイン追加

次のコマンドでphpのプラグインを追加します。

vfox add php

Configureオプション

vfox-php がPHPをビルドする際のConfigureオプションは、

~/.version-vfox/plugin/php/bin/install

内の91行目あたりに

  global_config="--prefix=$install_path \
    --enable-bcmath \
    --enable-calendar \
  ・・・(以下略)・・・

のように定義されています。

ここを編集すればConfigureオプションを変更できます。

でも、これって、PHPの各バージョンとも全て同じConfigureオプションを適用するってことですよね?

なんか危険な匂いがしますよ。

依存パッケージインストール

vfox-phpでのPHPビルドに必要な依存パッケージをaptでインストールします。

必要なパッケージのリストは

vfox-php/.github/workflows/test-linux.yaml at main ?? version-fox/vfox-php
PHP plugin for vfox. Contribute to version-fox/vfox-php development by creating an account on GitHub.

に記載されています。が、足りないようなので、「locate」も追加しておきましょう。

sudo apt-get update && sudo apt-get install -y autoconf bison build-essential curl gettext git libgd-dev libcurl4-openssl-dev libedit-dev libicu-dev libjpeg-dev libmysqlclient-dev libonig-dev libpng-dev libpq-dev libreadline-dev libsqlite3-dev libssl-dev libxml2-dev libxslt-dev libzip-dev openssl pkg-config re2c zlib1g-dev locate

PHPインストール

次の2通りの方法があります。

  • 1.リストから選択してインストールする方法
  • 2.バージョン直指定でインストールする方法

▼1.リストから選択してインストールする方法

vfox search php

※インストール可能なバージョンのリストとカーソル「->」が表示されます。

※「↑」「↓」キーで上下移動、「←」「→」キーでリストページ移動です。

※v5.3.2まで遡ってインストールできるようです。

[Enter]で確定するとインストールが始まります。

10分程度で完了しました。

Composerもインストールされていますね。

▼2.バージョン直指定でインストールする方法

v8.3.14をインストールする場合は

vfox install php@8.3.14

インストール済バージョンの一覧

vfox list
または
vfox ls
または
vfox list php

バージョン切り替え

バージョンの切替は

vfox use

コマンドで行いますが、2通りの方法があり、

それぞれに適用スコープのオプション(省略可)3通りがあります。

一応、ヘルプは次のようになっています。

$ vfox use --help
NAME:
   vfox use - Use a version of the target SDK

USAGE:
   vfox use [command options] [arguments...]

CATEGORY:
   SDK

OPTIONS:
   --global, -g   Used with the global environment (default: false)
   --project, -p  Used with the current directory (default: false)
   --session, -s  Used with the current shell session (default: false)
   --help, -h     show help
  • 1.バージョン指定なしの方法→リストから選択
  • 2.バージョン直指定の方法

適用スコープのオプション

  • グローバル: –global または -g
  • プロジェクト: –project または -p
  • (シェル)セッション: –session または -s

▼1.バージョン指定なしの方法→リストから選択(グローバル)

vfox use -g php

バージョン一覧が表示されるので、矢印キーで選択して[Enter]で確定します。

▼2.バージョン直指定の方法(プロジェクト)

vfox use -p php@8.3.14

ただ、-p オプションの指定はバージョンコントロールが不安定なようで、

この時はたまたま8.3.14に切り替わりましたが、

8.4.1のままだったり、プロジェクトフォルダ外でも8.3.14だったりします。

結構な致命傷だと思います。。少なくとも、筆者としては使えないレベルだと感じます。

例えば、ある開発プロジェクトで、サポート中の各PHPバージョンについて自動テストする際に、バージョン切り替えが安定していないとテスト結果が信用できないことになります。

この辺はissueとして挙げておくべきでしょうか。。

これは vfox の issue なのか、vfox-php の issue なのか、切り分けしないといけないのかと思うと本当に面倒です。。

現在のバージョンでは、面倒でも毎回 -g オプションで切り替えるのが確実かもしれません。

ImagickをPHP拡張としてインストール

PHP拡張をインストールするには、PHP各バージョンをインストール後に、

PHPバージョンの切替をしてから「pecl」コマンドを使ってインストールすれば、使用中のPHPバージョンだけのPHP拡張としてインストールできます。

では、PHP8.3.14にimagickをインストールしてみます。

vfox use -g php@8.3.14

pecl コマンドで imagck をインストールします。

pecl install imagick

※途中で「Please provide the prefix of ImageMagick installation [autodetect] :」と訊かれますが、何も入力せずに [Enter] を押します。

~/.version-fox/cache/php/v-8.3.14/php-8.3.14/lib/php/extensions/no-debug-non-zts-20230831/

内に imagick.so がインストールされました。

実行権限を追加しておきます。

chmod 755 ~/.version-fox/cache/php/v-8.3.14/php-8.3.14/lib/php/extensions/no-debug-non-zts-20230831/imagick.so

※バージョンによりインストールフォルダは異なります。パスは適宜変更してください。

続いて、imagickを有効にする設定を php.ini に追記します。

8.3.14の php.ini は、

~/.version-fox/cache/php/v~-8.3.14/php-8.3.14/conf.d/php.ini

にあります。

このファイルに次の1行を追記します。

extension="imagick.so"

imagickが有効になっているか確認します。

php -i | grep imagick

所感

vfoxは一応それなりに使えるツールだとは思います。

ただし、次の点はいただけないと思っています。

  • phpの全バージョンとも同じConfigureオプション → バージョン毎に編集すれば一応対応可能
  • バージョンの適用が不安定 → -g オプションであれば間違いない

※phpenvはPHPバージョン毎にConfigureオプションを定義していました。この辺はphpenvの方がきめ細かい対応で安心して使えますね。

※phpenvではPHP拡張までをインストール時の管理対象としていましたが、

※vfoxでは管理対象外(?)となっています。ポリシーとしてはアリかも。

筆者の個人的な結論としては、vfoxを使いつつ、asdfやmise等、他のツールも使ってみて比較検討する必要はあると思っています。

そちらも近々対応予定です。

他にも、asdfとmiseについても、次の記事の通り試してみました。

コメント

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