Homebrewでyarnが怒られた話

3 min read読了の目安(約3200字

はじめに

以前、M1 Macbook にて Homebrew を使い、anyenv と nodenv をインストールして node.js を使った開発環境を構築しました。

パッケージマネージャに yarn を使おうと Homebrew からインストールしたのですが、brew doctorコマンドで見てもらったところ以下のような Warning がでてきて焦りました。

$ brew doctor

Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause formulae that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  yarn

brew doctor コマンドを使用するとこのメッセージが表示されますが、問題なく yarn を使ったパッケージ管理はできます。
メッセージの種類も Warning : だったので致命的なエラーではないという判断で今日まで放置していましたが、コマンドを実行するたびに表示されるのが少し気になり精神衛生上あまり良くないので解決策を探してみました。

環境・バージョン等

  • MacOS Big Sur 11.2.1
  • HomeBrew 3.0.2
  • anyenv 1.1.2
  • nodenv 1.4.0+3.631d0b6
  • node.js 14.15.4
  • yarn 1.22.10

ここまでやったこと

https://github.com/anyenv/anyenv#homebrew-for-macos-user

上記を参考に homebrew で anyenv をインストールし、anyenv 経由で nodenv をインストール、node.js 14.15.4(LTS)をグローバルとローカルの両方に指定しました。

当初は npm を使って yarn をインストールしようとしてましたが、catnoseさんのこちらの記事で M1 Mac の homebrew を使って yarn をインストールできそうだったため homebrew を使って yarn をインストールすることにしました。

# homebrew経由でyarnをインストール
$ brew install yarn

# バージョン確認
$ yarn --version
1.22.10

インストールに成功し、yarn を使ったパッケージの管理はエラーなく行えるが、brew doctor を実行するたび毎回 Warning が表示されるようになりました。

解決策

結論としては、すでに yarn が存在しており、シンボリックリンクが切れていることが原因でした。

エラーを見てみると、一番上に You have unlinked kegs in your Cellar.とあり、どうやらリンクが上手くできないために表示されているようです。
Cellar とは貯蔵庫を意味し、Homebrew ではコマンドの実体(Keg)を格納するためのディレクトリを指しています。

Celllar ディレクトリの場所は以下のコマンドで調べることができます。

$ brew --cellar

/opt/homebrew/Cellar

メッセージにてリンクしろと言われていたため brew link コマンドでリンクを試みるも。

$ brew link yarn

Linking /opt/homebrew/Cellar/yarn/1.22.10...
Error: Could not symlink bin/yarn
Target /opt/homebrew/bin/yarn
already exists. You may want to remove it:
  rm '/opt/homebrew/bin/yarn'

To force the link and overwrite all conflicting files:
  brew link --overwrite yarn

To list all files that would be deleted:
  brew link --overwrite --dry-run yarn

どうやらすでに Yarn が /opt/homebrew/bin/yarn 配下に存在しておりシンボリックリンクに失敗しているようです。

$ rm `/opt/homebrew/bin/yarn`

でディレクトリを削除して、競合するファイルを上書きしながらリンクを行いました。

$ brew link --overwrite yarn

Linking /opt/homebrew/Cellar/yarn/1.22.10... 2 symlinks created.

これで上手くシンボリックリンクが作成されたようです。

$ brew doctor

Your system is ready to brew.

yarn に対する Warning がきれいさっぱりなくなりました。

おわりに

Homebrew を使ってまだ日が浅いため、わからないことが多くありましたが、無事に問題を解決できました。
Homebrew は brew doctor コマンドで起こっている問題をわかりやすく提示してくれるのがいいですね。

結果的に今回のエラーがなぜ起こっていたのかわかりませんでしたが、ずっと放置していた警告メッセージがなくなり今後ぐっすり眠れそうです。
エラーメッセージをしっかりと読み対応することが以下に大切かを感じさせられます。
今回の問題は yarn 以外でも起こり得るようなので、同じような問題を抱えている方の参考になれば幸いです。

最後まで読んでいただきありがとうございました。

参考