流行りの volta を pnpm 構成に導入するため色々調べる

2024/08/04に公開

はじめに

volta は、そのコンセプトから凄く良いツールです。これは volta を貶める記事ではありません。

背景

  • 新規リポジトリ立ち上げにあたり、node そのものの管理ツールを入れる必要がある。
  • トレンドや 性能面から volta を使いたい。

要件

  1. pnpm を使うこと。
  2. できるだけ少ないアクションで 開発を始められること。
  3. スクリプトでの環境構成はしないこと。
  4. バージョンに関する指定は一元的にすること。
  5. 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 バージョン時点のものです。

選択肢

  1. volta + pnpm
  2. 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 サポートは 実験的で 環境変数の設定が必要

https://docs.volta.sh/advanced/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

2. volta setup では インストールが実行されない。

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 アクションで構成が完了できて早い。
このメリットが大きいと判断した。

関連リンク

https://docs.volta.sh/

Discussion