結論

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」とあるが、主要プラットフォームではプリビルドバイナリのダウンロード・配置がメインの仕事。