nikkie-ftnextの日記

イベントレポートや読書メモを発信

そうか、シンボリックリンクを使えばコマンドのバージョンを切り替えられるのか!(phpunitを例に)

はじめに

広島のnikkieです。

めちゃ基本的なことだと思うのですが、使い方をようやく得心したことについて書いていきます。

目次

PHPUnitをPHARでインストール

PHPUnitのドキュメントに沿って進めていきます。
https://docs.phpunit.de/en/10.5/installation.html#manual-download-of-phar

PHPのバージョンは以下です1

% php --version
PHP 8.3.1 (cli) (built: Dec 21 2023 17:49:39) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.1, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.1, Copyright (c), by Zend Technologies

wgetPHP Archive (PHAR)を取得します。

% wget https://phar.phpunit.de/phpunit-10.phar

% php phpunit-10.phar --version
PHPUnit 10.5.10 by Sebastian Bergmann and contributors.

PHPUnitは先日バージョン11がリリースされました。

バージョン11もダウンロードします。

% wget https://phar.phpunit.de/phpunit-11.phar

% php phpunit-11.phar --version
PHPUnit 11.0.2 by Sebastian Bergmann and contributors.

2つのバージョンのPHPUnitは以下に置くことにしました。

~/opt/phpunit/
├── phpunit-10.phar
└── phpunit-11.phar

PHAR自体を実行できるようにします

% chmod u+x phpunit-1[01].phar

シンボリックリンクを使えば、PHPUnitのバージョンを簡単に切り替えられる!

ドキュメントには以下のようにあります

It is a common practice to use different versions of PHPUnit on a per-project basis.

意訳 プロジェクトごとに異なるバージョンのPHPUnitを使うのは、よくあるプラクティスです

(私はPython歴が長いのですが、プロジェクトごとの仮想環境にpytestを入れるので、それと同様の話と理解しました)

PHPUnitのPHARはtoolsディレクトリの下に置く方法が案内されています。

The tools directory contains tools such as PHPUnit packaged as PHP archives.

.
├── src
├── tests
└── tools

このドキュメントにはPhiveなるツールを使ったインストール方法も案内されているのですが、
https://docs.phpunit.de/en/10.5/installation.html#installing-phpunit-with-phive
それを見て、「toolsの下にphpunitへのシンボリックリンクを作ればバージョンを簡単に切り替えられるじゃん!」と気づきました。

% ln -s ~/opt/phpunit/phpunit-10.phar tools/phpunit

この状態でtools/phpunitを実行すれば、10系のPHARファイルが実行されます

% tools/phpunit --version
PHPUnit 10.5.10 by Sebastian Bergmann and contributors.

11系への切り替えはこちら。
すでにあるシンボリックリンクをunlinkした上で、11系へのシンボリックリンクを作っています(-f

% ln -s -f ~/opt/phpunit/phpunit-11.phar tools/phpunit

切り替わりました!

% tools/phpunit --version
PHPUnit 11.0.2 by Sebastian Bergmann and contributors.

実際のPHPプロジェクトではやらないのかもしれませんが、私は直近でPHPUnitのトークを控えており、バージョンを簡単に切り替えて動作確認できるのはとても役に立っています。

終わりに

PHPUnitを例に、シンボリックリンクでコマンドのバージョンを切り替えられることをようやく理解しました。

同じ仕組みを$PATHと組み合わせる2こともできますよね(例:kubectl)。
例えばコマンドのバイナリはopt下に置いておき、$PATHに含まれるディレクトリに特定のバージョンのコマンドへのシンボリックリンクを作ります。

白状すると、このあたりが分かっていなかったので、「バージョンアップするときに考えよう」と何でも雑に$PATHに置いたり、$PATHを追加したりしてきました3
シンボリックリンクの一手間を加えればバージョン切り替えが簡単になるということですね。
切り戻しが簡単なのが嬉しみです。


  1. brewで入れました
  2. StudyCoさんの勉強会で学びました
  3. 塩塩天使様の「舐めているのですか?」が聞こえてきています。おお、どうかお許しください(しかし塩対応の頃もかわいい)