😨

nodenvでglobalパッケージをuninstallできなくなったときの対処法(shimsを削除)

2021/02/05に公開

問題の背景

  • M1 Macの環境構築でyarnを入れようとした
  • 「Homebrewがyarnに未対応だからnpm install -g yarnでインストールする」という記事を読んで、そのとおりにした
  • あとから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 with nodenv 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