macOS Homebrew Caskで古いcaskのエラーを対処する

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'

ここにありました:

brew cask Update or uninstall error: definition is invalid: invalid 'depends_on macos' value: ":lion"
I can't uninstall or upgrade some casks due to a definition error. F.e. if I run update or upgrade: brew cask upgrade the-unarchiver Error: Cask 'the-unarch...

上のstackoverflowに書いてありますが、原因と、対処方法で何をしているかの2点を記録しておきます。

原因

Homebrew caskの開発者の方々がそれまで行っていたパッケージのOSのバージョンチェックを行わなくなったためのようです。

正確に書くと、/usr/local/Caskroom/filezilla/.metadata/3.29.0/20171201040211.828/Casks/filezilla.rbdepends_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文字にする。
  • メタデータは複数存在する可能性があるので、xargsfindの結果の各々に対して正規表現を使って対象部分を置換する。

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

[新版 zsh&bash対応]macOS×コマンド入門 ──ターミナルとコマンドライン、基本の力 (WEB+DB PRESS plusシリーズ)
macOS×コマンド入門 ──ターミナルとコマンドライン、基本の力 (WEB+DB PRESS plusシリーズ)

コメント

タイトルとURLをコピーしました