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.