homebrew caskのエラーを対処する。
発生事象
homebrewで使っているものを確認しようと思ったらエラーが出ました。
$ brew list
# ...
Error: Cask 'filezilla' definition is invalid: invalid 'depends_on macos' value: unknown or unsupported macOS version: :mavericks
対処方法
以下を実行すればOKです:
$ /usr/bin/find "$(brew --prefix)/Caskroom/"*'/.metadata' -type f -name '*.rb' -print0 | /usr/bin/xargs -0 /usr/bin/perl -i -0pe 's/depends_on macos: \[.*?\]//gsm;s/depends_on macos: .*//g'
ここにありました:

上のstackoverflowに書いてありますが、原因と、対処方法で何をしているかの2点を記録しておきます。
原因
Homebrew caskの開発者の方々がそれまで行っていたパッケージのOSのバージョンチェックを行わなくなったためのようです。
正確に書くと、/usr/local/Caskroom/filezilla/.metadata/3.29.0/20171201040211.828/Casks/filezilla.rbのdepends_onが:
cask 'filezilla' do
version '3.29.0'
# ...
depends_on macos: '>= :mavericks'
# ...
end
のようになっていて、これを認識できなくてエラーが出ています。
rubyはよくわからないから詳細は不明です…。互換性の維持って大変そう。維持しなくなるのも無理はないし、セキュリティの観点からも仕方がないですね。
対処で何をしているか
caskでインストールしたもののメタデータを書き換えます。つまり、バージョンチェックと思われるdepends_on macosの部分を削除します。
- メタデータを
/usr/bin/find "$(brew --prefix)/Caskroom/"*'/.metadata' -type f -name '*.rb'で探す。 findの--print0オプションでファイル名の末尾を改行文字でなくnull文字にする。- メタデータは複数存在する可能性があるので、
xargsでfindの結果の各々に対して正規表現を使って対象部分を置換する。
perlでしていることについては、unix - Perl regex to act on a file from the command line - Stack Overflow https://stackoverflow.com/questions/4361004/perl-regex-to-act-on-a-file-from-the-command-line
が詳しいです。perlも馴染みが薄いのでよくわからないですが、正規表現をCLIで使えるようですね。s/before/after/gの形式は;で区切って複数指定できることを知りませんでした。perlだけの仕様かもしれませんが。
考えてみれば、perlでなくsedなどでもできるなーとも思いました。しかし関連するパス名を調べるのは大変ですね。
おわり
最近はcaskを使っていなくて整理しようとしてbrew listで上のエラーが出て、brew uninstallしようとしても同じエラーが出るのでこれはなんとかせねばと思って色々調べた結果、上のような感じになっているようです。仕様変更は仕方ないですね。
caskの仕組みはよくわかっていなかったのでメタデータの配置などは一応勉強になりました。
xargsについてもあまり使うことを思いつかないので勉強になります。これは使うようにしたい。
Cask=樽。
以上です。
Amazonアソシエイト: 基本的にmacOSでコンソールを使う初学者向け(コマンドのクイックリファレンス付き)



コメント