nodenvでglobalパッケージをuninstallできなくなったときの対処法(shimsを削除)
問題の背景
- M1 Macの環境構築でyarnを入れようとした
- 「Homebrewがyarnに未対応だから
npm install -g yarn
でインストールする」という記事を読んで、そのとおりにした- npmはnodenvで管理
- あとからHomebrew(
brew install yarn
)を試したら普通に動くっぽい - npmでグローバルインストールしたyarnを削除することに
npmでグローバルインストールしたyarnが消えない
まず以下を試した。
$ npm uninstall -g yarn
# => up to date in 0.034s # これだけではuninstallできていないっぽい
$ which yarn
# => /Users/ユーザー名/.nodenv/shims/yarn
# shimを削除
$ rm -rf /Users/ユーザー名/.nodenv/shims/yarn
$ which yarn
# => /opt/homebrew/bin/yarn # Homebrewの方が反映されてる🙌
rm -rf /Users/ユーザー名/.nodenv/shims/yarn
により、npmでインストールしたyarnのshimが消えて、Homebrewの方が読まれるようになった。これで一件落着…と思いきやnodenv rehash
を実行したら復活してしまった。
$ nodenv rehash
$ which yarn
# => /Users/ユーザー名/.nodenv/shims/yarn # なぜかshimが復活😿
nodenvでshimが消えない場合の対処法
Stack Overflowなどで似たようなトピックに対する回答はたくさんあったが、ピンポイントの対処法は見つからなかった。で、nodenvのリポジトリを見てたらwikiに[FAQ - cannot remove shim]というものがあった。
nodenv keeps shims around in two cases:
The executable is still present in any Node version. Check withnodenv whence <shim>
The shim was kept around by a plugin. Check your list of plugins:
nodenv hooks rehash
Typically this is as easy as ls -al $(nodenv root)/versions/*/bin and you'll find the offending bin still lives in one of your node versions.
Remove it and then nodenv rehash.
プラグインは特に入れていないので「nodenvで管理しているいずれかのnodeバージョンにyarnの実行ファイルが残っている」ことによりshimも残ってしまっているっぽい。
というわけでこのドキュメントの通りにする。
$ ls -al $(nodenv root)/versions/*/bin
# /Users/ユーザー名/.nodenv/versions/14.15.4/bin:
# ...
+ # lrwxr-xr-x 1 ... -> # ../lib/node_modules/npm/bin/yarn.js # 👈
# ...
yarn.js
が見つかったのでこれを削除する。
$ rm -rf /Users/ユーザー名/.nodenv/versions/14.15.4/lib/node_modules/npm/bin/yarn.js
そのうえでrehash
をしておく。
$ nodenv rehash
Discussion