Node.js (nodenv) はビルド依存パッケージ不要 — pyenv との違い
結論
nodenv install (node-build) は プリビルドバイナリをダウンロードするだけ なので、ビルド依存パッケージは不要。
一方 pyenv install は 常にソースからコンパイルする ため、build-essential 等が必須。
pyenv の場合(ビルド依存が必要)
pyenv は Python をソースからコンパイルするため、以下のようなパッケージが必要:
# Ansible での例
pyenv_build_deps:
- make
- build-essential
- libssl-dev
- zlib1g-dev
- libbz2-dev
- libreadline-dev
- libsqlite3-dev
# ... etc
これらがないと pyenv install 3.9.22 はビルドエラーで失敗する。
nodenv (node-build) の場合(不要)
node-build は Linux x86_64 / macOS など主要プラットフォーム向けに nodejs.org が配布するプリビルドバイナリ をダウンロード・展開する。
# 内部的にはこれに近い処理
curl -o node-v20.20.0-linux-x64.tar.gz https://nodejs.org/dist/v20.20.0/node-v20.20.0-linux-x64.tar.gz
tar xzf node-v20.20.0-linux-x64.tar.gz -C ~/.nodenv/versions/20.20.0/
コンパイルしないので build-essential 等は不要。
必要な前提条件
ビルド依存は不要だが、以下は必要:
| 条件 | 理由 |
|---|---|
| ネットワーク疎通 | nodejs.org へ HTTPS アクセスしてバイナリを取得 |
| ディスク容量 | Node.js 20.x は展開後 ~80MB |
| node-build プラグイン | nodenv のインストール機能を提供するプラグイン |
Ansible playbook での実装差異
# pyenv: ビルド依存パッケージのインストールが必要
- name: ビルド依存パッケージをインストール
apt:
name: ""
state: present
become: yes
- name: pyenv で Python をインストール
command: "pyenv install "
# nodenv: そのままインストールできる
- name: nodenv で Node.js をインストール
command: "nodenv install "
例外ケース
node-build がソースからコンパイルするケースもゼロではない:
- プリビルドバイナリが存在しないプラットフォーム(ARM 32bit 等の古い環境)
NODE_BUILD_FORCE_COMPILE=1環境変数を設定した場合
AWS EC2 Ubuntu (x86_64) であればこれらに該当しないため、気にする必要はない。
Tips: node-build の名前に惑わされない
「node-build」という名前から「ソースをビルドするプラグイン」と思いがちだが、実際には nodenv に install コマンドを提供するプラグイン。nodenv 本体にはバージョンのインストール機能がなく、node-build が以下を担当する:
- 利用可能なバージョン一覧の管理(
nodenv install --list) - バイナリのダウンロード・展開(または必要ならソースコンパイル)
~/.nodenv/versions/<version>/への配置
pyenv における python-build と同じ命名規則。名前に「build」とあるが、主要プラットフォームではプリビルドバイナリのダウンロード・配置がメインの仕事。