流行りの volta を pnpm 構成に導入するため色々調べる
はじめに
volta は、そのコンセプトから凄く良いツールです。これは volta を貶める記事ではありません。
背景
- 新規リポジトリ立ち上げにあたり、node そのものの管理ツールを入れる必要がある。
- トレンドや 性能面から volta を使いたい。
要件
- pnpm を使うこと。
- できるだけ少ないアクションで 開発を始められること。
- スクリプトでの環境構成はしないこと。
- バージョンに関する指定は一元的にすること。
- OS 側の構成・設定・別リポジトリなどの依存関係とできるだけ疎結合であること。
※ 5 番目はあまり検証できてません。
環境
ハードウェア
cat /proc/cpuinfo | grep -i "model name" | head -1
model name : AMD Ryzen 5 PRO 4650G with Radeon Graphics
cat /proc/meminfo | head -3
MemTotal: 37748736 kB
MemFree: 25868088 kB
MemAvailable: 32397236 kB
バージョン
root@8ff863992f66:/# volta --version
1.1.1
以降の内容はすべて 1.1.1 バージョン時点のものです。
選択肢
- volta + pnpm
- volta + corepack + pnpm
調査プロセス
可能な限り OS 依存関係なしの状況でテストするため、dockerを使う。
FROM ubuntu
RUN apt update && apt install -y curl
COPY package.json .
RUN curl https://get.volta.sh | bash
これで ビルドした イメージから調査を進める。
結果
良い点
1. 早い。とにかく早い。
root@01605301d970:/# volta setup
success: Setup complete. Open a new terminal to start using Volta!
root@01605301d970:/# time node --version
v22.5.1
real 0m6.813s
user 0m0.613s
sys 0m0.937s
7 秒前後。早いんす。
2. ツールそのもの導入も早い
root@43c49358eae5:/# time curl https://get.volta.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10930 100 10930 0 0 21598 0 --:--:-- --:--:-- --:--:-- 21600
Installing latest version of Volta (1.1.1)
Checking for existing Volta installation
Fetching archive for Linux, version 1.1.1
######################################################################## 100.0%
Creating directory layout
Extracting Volta binaries and launchers
Finished installation. Updating user profile settings.
Updating your Volta directory. This may take a few moments...
success: Setup complete. Open a new terminal to start using Volta!
real 0m3.065s
user 0m0.277s
sys 0m0.179s
3~4 秒ぐらい?はやいいんす。
3. package.json で 見やすいバージョン管理ができる。
"volta": {
"node": "22.5.1",
"pnpm": "9.6.0"
}
こういうのがあれば volta setup
したら、すぐ バージョンの設定が行われる。
README には volta setup
だけ書けばよい。
嬉しくない点
1. pnpm サポートは 実験的で 環境変数の設定が必要
export VOLTA_FEATURE_PNPM=1
という環境変数の設定が必要。
direnv などを入れてない環境・プロジェクトであれば「.bashrc や .zshrc に 設定を~」というアクションが不可欠になる。
これは環境ごとに差異が生まれる原因になりえる。
ただ、この環境変数の設定さえできれば volta setup
-> pnpm i
だけで 環境が整うので最強と呼べそう。
root@7d0d32057d86:/# export VOLTA_FEATURE_PNPM=1
root@7d0d32057d86:/# volta setup
success: Setup complete. Open a new terminal to start using Volta!
root@7d0d32057d86:/# pnpm i
Downloading typescript@5.3.3: 5.76 MB/5.76 MB, done
Downloading @biomejs/cli-linux-x64@1.8.3: 9.68 MB/9.68 MB, done
Downloading @biomejs/cli-linux-x64-musl@1.8.3: 9.40 MB/9.40 MB, done
Downloading @swc/core-linux-x64-gnu@1.7.5: 17.24 MB/17.24 MB, done
Downloading @swc/core-linux-x64-musl@1.7.5: 21.00 MB/21.00 MB, done
Packages: +552
volta setup
では インストールが実行されない。
2. root@9dd2f7e44ef2:/# volta setup
success: Setup complete. Open a new terminal to start using Volta!
root@9dd2f7e44ef2:/# volta install corepack
error: Node is not available.
To run any Node command, first set a default version using `volta install node`
volta setup
は 紐づけをするだけのコマンド。
上記を見ていただくと分かる通り、そのあとの npm
node
などの 依存コマンドを実行しない限りインストールが実行されない。
この影響で volta install corepack
の前にワンステップ入れる必要がある。
現バージョンでは、コマンドオプションなどで動作変更することもできない。
3. install プロセスを経ずに default Node バージョンを変更できない
root@7ccd475d1710:/# volta setup
success: Setup complete. Open a new terminal to start using Volta!
root@7ccd475d1710:/# npm --version
10.8.2
root@7ccd475d1710:/# volta install corepack
error: Node is not available.
To run any Node command, first set a default version using `volta install node`
root@7ccd475d1710:/# volta install node@22
success: installed and set node@22.5.1 (with npm@10.8.2) as default
note: you are using node@22.5.1 in the current project
root@7ccd475d1710:/# volta install corepack
success: installed corepack@0.29.3 with executables: corepack, pnpm, pnpx, yarn, yarnpkg
上記 2. の話にも関連する。
現バージョンの volta では、volta install
コマンドでしかデフォルトバージョンが変更できない。
これで何が起きるかというと「結局 volta install しないと corepack がインストールできない」という状況が生まれる。
つまり volta install node@22.5.1
という形でバージョンを指定する必要があり、バージョンが一元的で無くなる。
4. pnpm の path を奪い取る構成。
root@dc999878c388:/# which pnpm
/root/.volta/bin/pnpm
volta は pnpm の シンボリックリンクを 内包する形であり、pnpm のグローバル PATH などが設定されていたとしても 奪い取る可能性がある。
これは、別リポジトリなどの依存関係を吹っ飛ばす可能性がある。
どうしたか
README に export VOLTA_FEATURE_PNPM=1
に関する記述を入れることにした。
デメリット1,4 だけ目をつぶれば、たった 2 アクションで構成が完了できて早い。
このメリットが大きいと判断した。
関連リンク
Discussion