公開日: 2025年2月28日

FreeBSD でも Node.js のバージョンを管理したい

需要の有無はさておき、興味本位で「FreeBSD でも Node.js のバージョン管理を行うことはできるのか?」を考えてみました。結果、ちょっと細工をすればできることがわかりましたので、その方法を公にします。

FreeBSD で Node.js のバージョン管理は難しい

FreeBSD では、Node.js も npm も ports/packages で提供されているので、バージョンにこだわらなければ不都合はありません。ですが何らかの事情で「特定のバージョンの Node.js を使いたい」となったとたん、事態は急に難しくなります。というのは、Node.js のバージョン管理ツールはたいてい、Node.js 公式の配布先からそれぞれの OS 用にビルドされたバイナリパッケージをダウンロードするようになっているためです。見ればわかりますが (見なくてもわかりますが)、FreeBSD 用のバイナリなどという気の利いたものが置かれているはずもなく (苦笑)。それでもあえてやろうとするなら、指定されたバージョンのソースコードを取ってきてコンパイルするところから始めなくてはならないでしょう。そういうわけで、Node.js のバージョンを管理するなら、Windows か Linux か Mac を使うしかないのです。ん、Linux …?

Linux バイナリ互換機能を使う

久しく使っていなかったのですっかり忘れていましたが、FreeBSD には「Linux バイナリ互換機能」が備わっています。私が最後に使ったのは、Linux 用の Netscape Communicator で Shockwave だか Flash だかのプラグインを動かそうとしたときだったでしょうか (結局動いたんだっけ…?)。最近の事情はどうなのかなと思ったことも今回の試みのきっかけになりました。早速トライしてみましょう。

インストールは ports/packages から簡単に行えます。

# pkg install linux_base-rl9

OS 起動時から有効にするために、/etc/rc.conf に次の 1 行を追記します。

/etc/rc.conf
linux_enable="YES"

OS を再起動してカーネルモジュールが組み込まれたことを確認します。

% kldstat | grep linux
12    1 0xffffffff82742000    31988 linux.ko
13    4 0xffffffff82774000     be20 linux_common.ko
14    1 0xffffffff82780000    2dcd8 linux64.ko

バージョン管理ツールを導入する

続いてバージョン管理ツールを導入します。ここでは「Volta」と「NVS」での手順を紹介します。各ツールの使いかたはここでは触れないので、下記の関連記事を参照してください。

両ツールともインストール用のシェルスクリプトが用意されているのですが、unameまたはuname -sコマンドで OS 名を取得し、uname -mコマンドでマシンアーキテクチャを取得し、それらがサポート外だった場合は弾くようになっています。そこで、前者に対しては "Linux" を、後者に対しては "x86_64" を返すように「偽装」します。

なお、両ツールとも bash が必要となるので、事前にインストールしておいてください (実際には以下の作業は zsh で行いましたが)。

Volta の場合

uname の出力を偽装するシェルスクリプトを作ります。場所とファイル名は何でもいいですが、ここでは ~/node/preinstall.sh ということにしておきます。また、Volta のインストール先を ~/.volta とします。

~/node/preinstall.sh
VOLTA_HOME="$HOME/.volta"

uname() {
    case $1 in
        -m) echo "x86_64";;
        *) echo "Linux";;
    esac
}

Volta のインストールスクリプトを適当なディレクトリにダウンロードします。

% cd ~/node
% curl https://get.volta.sh > volta.sh

Volta をインストールします。先ほど自作した preinstall.sh と Volta のインストールスクリプトを cat コマンドで連結して bash に渡します。

% cat preinstall.sh volta.sh | bash

こうすると、volta.sh の 1 行目にある「#!/usr/bin/env bash」(※) は効力を失ってしまうのですが、最終的に bash に渡しているので特に問題はないと思います。

※ こういうのを「シバン」と呼ぶそうです (初めて知った…)。

これでインストールは完了です。使用しているシェルの rc ファイル (ここでは ~/.zshenv) に次の 2 行が追記されました。

export VOLTA_HOME="$HOME/.volta"
export PATH="$VOLTA_HOME/bin:$PATH"

シェルを再起動すると Volta を実行できるようになります。

% volta --version
2.0.2

NVS の場合

前節で Volta のために作ったスクリプトがそのまま使えます。気になるようなら 1 行目は削除してください。

NVS の公式リポジトリからgit cloneします。クローン先は ~/.nvs としています。

% export NVS_HOME="$HOME/.nvs"
% git clone https://github.com/jasongin/nvs "$NVS_HOME"

preinstall.sh と NVS のインストールスクリプトを「. (dot)」コマンドで実行します。

% cd ~/node
% . ./preinstall.sh; . "$NVS_HOME/nvs.sh" install

これでインストールは完了です。使用しているシェルの rc ファイル (ここでは ~/.zshrc) に次の 2 行が追記されました。

export NVS_HOME="$HOME/.nvs"
[ -s "/usr/home/mijinco/.nvs/nvs.sh" ] && . "/usr/home/mijinco/.nvs/nvs.sh"

シェルを再起動すると NVS を実行できるようになります。

% nvs --version
1.7.1

まとめ

unameの出力を Linux に偽装し、Linux バイナリ互換機能を使うことで、FreeBSD でも Node.js のバージョン管理を行えることがわかりました。これで FreeBSD が覇権を握ってしまった世界線でも安心して Node.js のバージョンを管理することができますね (笑)

広告