nodenv と volta は共存できるのか
TL;DR
nodenv と volta は共存可能
volta は後から入れるか、nodenv が先に参照されるようにしないと volta に引っ張られて nodenv がうまく機能しない
----
環境
code:/etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
volta が x86_64 じゃないと curl | bash で入らなかったので platform option で linux/amd64 にしている
docker run -it --platform=linux/amd64 ubuntu bash
実験1:volta 先入れ
volta install node@20 して、node -v -> v20.3.0
nodenv install node 20すると、20.2 系が入った
node -v -> v20.3.0
volta に引っ張られてそう
適当にディレクトリ作ってみる
mkdir volta-test
npm init
volta install node@v16.20.0
volta pin
code:package.json
…
"volta": {
"node": "16.20.0"
}
node -v -> v16.20.0
うまく動いている
.node-version を適当に作って、v20 系を書いても引っ張られない
適当にディレクトリ作ってみる 2
mkdir nodenv-test
npm init
nodenv install node 18.16.0
touch .node-version ← 18.16.0 を入れる
node -v -> v20.3.0
なるほど…?
volta を先に導入してると永遠と volta に引っ張られるのかも
volta を消してみる
rm -rf ~/.volta
node -v -> v20.2.0
それはそう
volta pin していたディレクトリでは
当然 volta を消すと、nodenv global が使われる
ここから volta を再導入したらどうなるだろうか
curl https://get.volta.sh | bash -> source ~/.bashrc
あ、なんかいい感じになった
/ で、node -v -> v20.2.0 → nodenv global が使われる
/nodenv-test で node -v -> v18.16.0 → .node-version を nodenv が参照して切り替えている /volta-test で node -v -> v16.20.0 → package.json を volta が見て切り替えている ということは
どちらも使う必要があるなら、nodenv を先に入れて nodenv が先に参照して node を出すようにするとよさそう
そのうえで、nodenv が見る .node-version がないかつ package.json に volta の設定があると、volta が node を切り替えてくれそう
そうすれば、global では nodenv が global を返してくれる