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でコンソールを使う初学者向け(コマンドのクイックリファレンス付き)
コメント