rcmdnk's blog

Aluminor - CASK 2 - Suspension - 40 W - E27 - Chrome

Homebrew Cask でインストールしたアプリについて、 アプリ自体のアップデートはほとんどのアプリで自分で行われていますが、 brew-file を使ってインストールされてるアプリを調べたら Caskでインストールされたはずの物も多くがCaskの管理外、と出てしまいました。

これはCaskファイル自体のバージョンが上がっていても、 Caskコマンドにはアップグレードコマンドが無いため、 古いディレクトリにそのまま新しい物がアプリ自身によってインストールされてるためです。

それ程困る話でもないのですが、アップグレード出来るようにしてみました。

Sponsored Links

brew cask upgrade

upgradeコマンドについては本家の方でも議論されています。

brew cask upgrade · Issue #309 · caskroom/homebrew-cask

Draft Roadmap: brew cask upgrade · Issue #4678 · caskroom/homebrew-cask

Todoリストの中でもハイプライオリティで進めていきたいとされてますが、 一筋縄で行くものでもないようです。

upgradeスクリプト

こんな感じのスクリプトで 全てのCaskによってインストールされたアプリが 最新のCaskファイルと対応してるかチェックして インストールし直すことが出来ます。

cask_upgrade.sh
1
2
3
4
5
6
apps=($(brew cask list))
for a in ${apps[@]};do
  if grep -q "Not installed" < <(brew cask info $a);then
    brew cask install $a
  fi
done

brew cask listではCaskによってインストールされた全アプリがリストされますが、 brew cask infoでは、インストールされているかどうかはバージョン単位で 調べるため、 Cask内でのバージョンが上がっているとNot installedと表記されます。

これを使って古いバージョンのものがあれば新しいバージョンをインストールして リンクが新しい方へ向く様に変更が行われます。

ただし、古いといっても、Caskのディレクトリ的に古いだけで、 実際にはアプリ自身でアップデートしていて最新になっている場合もあります。 (むしろCaskのほうが古いバージョンを指定している場合も。)

そのようなときに微妙ですが、管理する上ではアップグレード しておいたほうがやりやすいといえばやりやすいかと。

また、これを行うと端からアプリをチェックして再インストールしたりするので、 使っているアプリがあるとおかしな動作をする可能性があります。

ですので、もし、アップグレードをしたい場合は、バックアップを取った状態で 消えたら困るような物を開いてない状態で行ってください。

これを実行した結果、一度途中でMacが落ちてしまいました。 (どのアプリのところかはイマイチ確認できず。。。 ただ、再起動後にもう一度行ったら何も問題なく動いています。)

ちなみに古いバージョンの消去ですが、 brew cleanup --forceしてもbrew cask clenupしても消せません。

upgradeを考慮に入れてないのでcask cleanupでも古いバージョンを消す 操作が入ってません。

古いバージョンを消すには上のを

cask_upgrade.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
caskroom="/opt/homebrew-cask/Caskroom"
apps=($(brew cask list))
for a in ${apps[@]};do
  info=$(brew cask info $a)
  if echo "$info"| grep -q "Not installed";then
    brew cask install $a
  fi
  current=$(echo "$info"|grep "${caskroom}/${a}"|cut -d' ' -f1)
  for dir in $(ls ${caskroom}/${a});do
    testdir="${caskroom}/${a}/${dir}"
    if [ "$testdir" != "$current" ];then
      rm -rf "$testdir"
    fi
  done
done

みたいに変えてあげれば一応消せます。

brew-fileのコマンド: cask_upgrade

この前アップデートした brew-file の中にもコマンドを入れてみました。

$ brew file cask_upgrade

とすると上のアップグレードコマンドが実行される様になっています。

$ brew file cask_upgrade -C

とするとCleanupコマンドも同時に行います。

また、これとは別に

$ brew file casklist

というコマンドがあります。 このコマンドは、/Applications等にあるアプリを片っ端から調べて、 Caskが用意されているかどうか、さらにCaskによってインストールされているかどうか、 の結果を出してくれます。

これを使うと自分が使ってるアプリの中で、Caskが用意されてる物を簡単に見つけられるので、 必要ならCaskでインストールし直すことが簡単に出来るようになります。

これを試している時に、やたらと多くのアプリがCaskはあるけど Caskによってインストールされてない、と出て調べてみてみたわけです。

brew-fileのpythonバージョン

今回の話に直接関係ないですが、 スクリプトが大きくなってきて実行時間も少し気になってくるようになったので、 シェルスクリプト以外で実装してみよう、ということでPythonで書きなおしてみました。

homebrew-file/brew-file at python

Homebrewからでも

$ brew rcmdnk/file/brew-file --devel

または、すでにrcmdnk/homebrew-file をtapしてあれば、

$ brew brew-file --devel

とするとpythonバージョンがインストールされます。

結局特に時間がかかるのがbrew updateコマンドだったりするので劇的に 速くなったわけでは無いですが、 沢山インストールしている状態だとinitコマンド等で結構処理が速くなりました。

良さそうならこちらを主戦に置き換えたいと思います。

Rubyで書こうかとも思ったのですが、Rubyはまだ良くわからないので 取り敢えずPythonで。

RubyだとHomebrewの中でRubyだけで閉じて行えるのでもっと速くできるかもしれません。

Sponsored Links
Sponsored Links

« Lubuntuのキーボードショートカットの設定:openbox GitHubでWeb上で縦分けdiffが出来るようになった »