Post

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

This post is licensed under CC BY 4.0 by the author.