2019/08/13

nodenv を使って複数のバージョンの Node.js を管理する

プロジェクト毎に指定の Node.js のバージョンがあったり、常に最新の Node.js を使いたかったりすると、Homebrew だけで管理するのは面倒になってきます。

今回は nodenv を使って Node.js の環境を作ろうと思います。
ちなみに私は Ruby では rvm より rbenv 派。
なので nvm よりは nodenv かな、と。

環境

  • OS: macOS Mojave 10.14.6
  • zsh: 5.7.1
  • Homebrew: 2.1.9
  • Homebrew/homebrew-core (git revision 2548c; last commit 2019-08-11)
  • nodenv: 1.3.0
  • node-build: 4.6.3


インストール

  • $ brew install nodenv
  • $ nodenv init
    • eval "$(nodenv init -)"
    • を .zshrc に追加せよ、と言ってきますので追記
  • $ nodenv install 12.8.0
    • とかで好きなバージョンを指定
  • $ nodenv global 12.8.0
    • とかで通常使用するバージョンを指定できます。
  • $ nodenv local 12.7.0
    • とかで特定ディレクトリの下で使用するバージョンを指定します。
    • 具体的には .node-version というファイルが作られて、そこにバージョンが書かれる。


nodenv init をちょっと追ってみる

ちなみに zsh 上で
  • $ nodenv init -
とすると
# nodenv init -
eval export PATH="/Users/atton/.nodenv/shims:${PATH}"
export NODENV_SHELL=zsh
source '/usr/local/Cellar/nodenv/1.3.0/libexec/../completions/nodenv.zsh'
command nodenv rehash 2>/dev/null
nodenv() {
local command
command="${1:-}"
if [ "$#" -gt 0 ]; then
shift
fi
case "$command" in
rehash|shell)
eval "$(nodenv "sh-$command" "$@")";;
*)
command nodenv "$command" "$@";;
esac
}
view raw nodenv.sh hosted with ❤ by GitHub


のような設定がされることが分かります。つまり、
  • executables がある PATH を追加する
  • NODENV_SHELL の設定
  • 補完スクリプトを source
  • nodenv rehash (executables の再配置)
  • nodenv の wrapper
    • rehash と shell の両コマンドは特別扱い(eval する感じ)みたいですね
    • 興味がある人はさらに読んでみても良いかと思います。

nodenv init と shell 指定

rbenv を設定していた時に見つけたのですが、特定の shell であることを指定することもできます。
具体的には $SHELL が zsh の状態でも
  • $ nodenv init - bash
とすると
# $ nodenv init - bash
eval export PATH="/Users/atton/.nodenv/shims:${PATH}"
export NODENV_SHELL=bash
source '/usr/local/Cellar/nodenv/1.3.0/libexec/../completions/nodenv.bash'
command nodenv rehash 2>/dev/null
nodenv() {
local command
command="${1:-}"
if [ "$#" -gt 0 ]; then
shift
fi
case "$command" in
rehash|shell)
eval "$(nodenv "sh-$command" "$@")";;
*)
command nodenv "$command" "$@";;
esac
}
view raw nodenv-bash.sh hosted with ❤ by GitHub

のような、bash 向けの設定が生成されます。
nodenv init - zsh と具体的に違うのは NODENV_SHELL と補完スクリプトの場所くらい。
zsh で bash の設定を読み込むなんてことはほぼ無いと思うので、 nodenv init - で問題無いと思います。


nodenv rehash

ちなみに zshrc に nodenv init - が記述される訳ですから、シェルを立ち上げる度に nodenv init - が実行されます。
気持ち程度の問題だとは思いますが、 rehash を省略するオプションがあって
  • $ nodenv init - --no-rehash zsh
とすると nodenv rehash が実行されません。
# $ nodenv init - --no-rehash zsh
eval export PATH="/Users/atton/.nodenv/shims:${PATH}"
export NODENV_SHELL=zsh
source '/usr/local/Cellar/nodenv/1.3.0/libexec/../completions/nodenv.zsh'
nodenv() {
local command
command="${1:-}"
if [ "$#" -gt 0 ]; then
shift
fi
case "$command" in
rehash|shell)
eval "$(nodenv "sh-$command" "$@")";;
*)
command nodenv "$command" "$@";;
esac
}

とはいえ普通はこのオプションのある無しで実行時間はほとんど変わらないです。
大量に package を入れたバージョンから新バージョンに上がった直後とかなら rehash にコストがかかるかも? 程度

とりあえず、私は .zprofile には rehash 無しの init script を書いてます。
それで、npm install -g とかしたら手で nodenv rehash を打つ、という運用をしています。

0 件のコメント:

コメントを投稿