brew search すると「Requires authentication」と言われたときにやること 兼 brew search の仕様変更について

brew search すると「Requires authentication」と言われたときにやること 兼 brew search の仕様変更について

TL;DR: まず brew update しましょう
Clock Icon2023.04.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

事象と対応

昨日 (4/12) あたりから、 brew search した際に以下のようなメッセージが出力される場合がある (あった) ようです。

Warning: Error searching on GitHub: GitHub API Error: Requires authentication

よくある (?) Rate limit の警告に似ているんですが、よく見ると理由が Requires authentication となっています。

詳細は後述しますが、ひとまず以下のコマンドを実行しましょう。

brew update

その後 brew search しなおせば、今度は警告無しにサーチ結果が出力されるものと思います。

また、メッセージ通りに GitHub Token を設定してもよさそうです。その場合は以下のブログが参考になると思います。

ちなみに日本時間の 4/13 早朝に対策版( 4.0.13 )がリリースされているので、 brew update した時点でそれが導入されていれば、以後この事象は発生しないと思われます。

% brew --version
Homebrew 4.0.13

ですがそれに伴って挙動に変化がありましたので、あわせて記します。

何がおきた?

まず、早速以下の Issue が立てられていました。

Issue の斜め読み知識で恐縮ですが、どうやら brew search 実行時に GitHub 上のデータの検索 API を叩いていたものの、そこで Token がない場合にエラーが出力されるようになった模様です。
この部分、もともと上述の Rate limit だったり、Token のありなしで GitHub の挙動が変わっていたので、Token なしの場合に何かしらの仕様変更があったのかも知れませんね。

このふたつを合わせ読むと、 Homebrew は検索時に、ローカルとリモートの両方のデータを検索していたようです。

Homebrew のパッケージデータは GitHub 上にあり、 brew update コマンドによってローカルに pull してきます。挙動から、そのローカルのデータが古かった場合にはリモート、つまり GitHub 上で直接検索をかけていたようです。

ひとつ前のバージョンの help メッセージ にも、はっきりと「 online and locally 」と書かれていますね。

どうなった?

その対策として、以下の Pull Request (PR) が立てられました。

こちらの PR で、リモートの検索機能が削除されました
つまり、今後は brew search しても、ローカルにあるデータしか検索されないということですね。

この仕様変更の決定にあたっては、以前からある「検索が遅い (too slow)」という不満を解消する意図もあった模様です。

いったんは「 brew search する直前に自動的に brew update が実行される」というコードもあったようですが、この理由により drop されました。

I see the benefit of this always being up-to-date. On the flip side, I've heard a bunch of people complain that "brew search is too slow" and I fear this may make it worse.

で、どうすれば?

ひとまず、 brew update すれば警告はでなくなり、いままで通りに使えるようになると思います。
ただし、 brew search しても最新のリモートデータに対する検索は行われなくなったことは認識しておくべきかと思います。

もし brew search しても目当てのソフトウェアが見つからない場合は、brew update してからもういちど実行すると見つかるかも知れませんね!

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.