TL;DR
Homebrewでnvmをインストールしている人限定の話です。
NVM_DIRをrcファイルに記載していない人の環境は一旦ぶっ壊れます。(nvmのアップデートで毎回ぶっ壊れていたので問題ないでしょう)
これからは、NVM_DIRを.bashrcなり.zshrcに指定しなくても、nvm関連のファイルは自動的に~/.nvm以下にインストールされるようになります。
つまり、以下をrcファイルに指定するだけで正しい動作をするようになったんです!
[ -s "/usr/local/opt/nvm/nvm.sh" ] && \. "/usr/local/opt/nvm/nvm.sh" # This loads nvm
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh" # This loads nvm
プルリク
去年の8月から作業してました。
説明
Arch LinuxのAURと同じことをするようにしただけです。
# $NVM_DIR should be "$HOME/.nvm" by default to avoid user-installed nodes destroyed every update
[ -z "$NVM_DIR" ] && export NVM_DIR="$HOME/.nvm"
\. /usr/local/Cellar/nvm/0.39.1_1/libexec/nvm.sh
# "nvm exec" and certain 3rd party scripts expect "nvm.sh" and "nvm-exec" to exist under $NVM_DIR
[ -e "$NVM_DIR" ] || mkdir -p "$NVM_DIR"
[ -e "$NVM_DIR/nvm.sh" ] || ln -s /usr/local/opt/nvm/libexec/nvm.sh "$NVM_DIR/nvm.sh"
[ -e "$NVM_DIR/nvm-exec" ] || ln -s /usr/local/opt/nvm/libexec/nvm-exec "$NVM_DIR/nvm-exec"
まず、NVM_DIRが設定されていなければ~/.nvmに設定します。これがHomebrewでのデフォルト値になります。
次に本物のnvm.shを読み込みます。
最後にNVM_DIRが存在しなければディレクトリを作成し、それ以下にnvm.shとnvm-execが存在しない場合はそれぞれの本物にシンボリックリンクを貼ります。いくつかのnvmのプラグインがNVM_DIR以下にこの2つのスクリプトが存在していることを前提とした動作をするらしいのでこのようなコードが追加されています。
なぜこのような実装が必要になったか
nvmはNVM_DIRが設定されていない場合、nvm.shの実体がある場所をデフォルトのNVM_DIRとして設定します。
Homebrewの場合、/usr/local/opt/nvm/libexecのようなパスに設定されるのですが、このoptディレクトリというのがクセ者で、nvmが更新される度に全消しされます。
実体は/usr/local/Cellar/nvm/0.39.1_1のような位置にあり、更新のたびに全消しされるのはHomebrewの仕様上仕方ないことです。
どうもnvmの作者であるljharbはこの問題が発生するたびにnvmにIssueが立つのにキレたらしく、Homebrew経由でnvmをインストールすると以下の警告文が表示されます。
Please note that upstream has asked us to make explicit managing
nvm via Homebrew is unsupported by them and you should check any
problems against the standard nvm install method prior to reporting.
ljharbの主張は、「ユーザーがインストールしたnodeは神聖な物であり、何人たりともそれを破壊することは許されない」だそうです。(どこで主張していたかは忘れました)
結論
今回の変更で、Homebrewはnvmがインストールしたユーザーのnodeにデフォルトで触らなくなったので、早くHomebrew経由のインストールがnvm公式が推奨するインストール方法の一つとして認められるといいなと願っております。