homebrew cask の個人用 formula についてのメモ

こちらの環境におけるアプリケーションの管理はすべて homebrew cask を使ってます.

cask に無いアイテムも幾つかありまして,それらについても自前で formula を用意しています.

そのひとつに myTracks というのがあるのですが,このインストールで以下の様なエラーを吐かれ処理が中断します.

==> Downloading http://www.mytracks4mac.info/download/myTracks2.dmg
######################################################################## 100.0%
==> Note: running "brew update" may fix sha256 checksum errors
Error: sha256 mismatch
Expected: 2e51df5efe9cd3c41a62235a71892e4afe1eaf70c6a64720cda11913c1c49bec
Actual: 2a97e9605c4bce74511752c0aa338a1332c5c313daded3a2f593a4205620aef5
File: /Library/Caches/Homebrew/mytracks-latest.dmg
To retry an incomplete download, remove the file above.

sha256 チェックサム値がおかしいと.

この度,これで戸惑ったので今後のために,とメモを残しておこうと思いました.

バージョンでした.- vresion には 'latest' ではなく,きちんとバージョン番号を.

原因は使っている formula の version の内容でした.

ソフトウェアは常に最新を使用するのを基本としているので,"latest" を当てていたのですが,これが良くなかった様子.

こう言う事もあるのですね.

cask :v1 => 'mytracks' do
  version '2.6.8'   # ← 'latest' ではなく,正しい version 番号を指定してやること.
  sha256 '2a97e9605c4bce74511752c0aa338a1332c5c313daded3a2f593a4205620aef5'

  url 'http://www.mytracks4mac.info/download/myTracks2.dmg'
  name 'mytracks'
  homepage 'http://www.mytracks4mac.info/c/index.php/en/'
  license :unknown

  app 'myTracks.app'
end

気付いたキッカケは,app store ではソフトウェアがメジャーバージョンアップしたと謳っていたにも関わらず,ダウンロードした dmg の app 名が myTracks2.dmg と "2" のままであったこと.*1

独自 cask formula 作成メモ

滅多に行う作業ではないのですが,だからこそ「あれ何だったっけ」と言うのがあって悲しくなったので.

以下内容は,homebrew cask のドキュメントにあるものです.
それに,個人的な内容ですが,今回の作業で「あれ」と思った事柄を追記してます.

ここでは以下のようなシーンを想定します.

『my-new-cask というアプリケーションの homebrew-cask の fomula を作る』

以下詳細です.;

  • 対象のアプリケーションは,'my-new-cask.app',配布用のデータは,'my-new-cask.dmg' とします.
  • homebrew および homebrew-cask は導入済みで,すべてデフォルトで使用しているとします.
  • 自分用の個人的な homebrew cask 用に 'mycaskroom' という名のリポジトリを持っていて.
  • それは github にて 'github_user/mycaskroom' というリポをもって管理しているものとします.*2
  • そして,話は出来るだけ簡単にしたいので ~/tmp と言うテンポラリの作業用ディレクトリを用意し,その中で行うものとします.

Step 00. 準備

  • "my-new-cask" をダウンロードしておく.
  • (必要に応じ)自分用の cask formula を収めているリポジトリを untap しておく.
brew untap github_user/my-casks-repo-name

以下手続き,;

Step 01. 対象となるアプリケーション用の cask formula を作成する.

% brew cask create my-new-cask
  • my-new-cask の formula として,my-new-cask.rb と言う名前でファイルが生成されます.
  • またこの手続きは,formula ファイルの生成と同時に,アプリケーションのアイテム名の命名をも行ったことでもある.
    • 今回の例ですと,"my-new-cask" という文字列は,各 brew cask コマンドで使用する際の,実際のアイテム名にあたります.アプリケーション名になる,と表現した方が分かりやすいでしょうか.
      例えば,brew cask search .. で使うキーワード文字列であり,また brew cask install .. で指定するアイテム名にあたります.
    • 名称はユーザー任意で適当に付けて構わないと思います.極端な話,自分が分かりやすい勝手な名前を付けてしまっても構わないということです.
    • 注意が必要なのは,名前の重複はだめ,ということぐらいかと*3

Step 02. (必要に応じ) 上述コマンドで作成した formula を探し,適当な作業しやすい所に持ってきておく.

% mdfind -name my-new-cask.rb
/usr/local/Library/Taps/caskroom/homebrew-cask/Casks/my-new-cask.rb  # ←コレ
% mdfind -name my-new-cask.rb | pbcopy
% mv /usr/local/Library/Taps/caskroom/homebrew-cask/Casks/my-new-cask.rb ~/tmp

Step 03. その formula をエディタ等で開いて,編集する.

Step 01 で生成された formula の中身は,下記のような感じ.

cask :v1 => 'my-new-cask' do
  version ''
  sha256 ''        # `shasum -a 256 /path/to/my-new-cask.dmg` で取得.引数で指定するパスは,*.dmg のもの.*.app ではない.

  url 'https://'   # ダウンロードした *.dmg の url.
  name ''          # アプリケーションの正式名称.そんなに厳密でなくても良いみたい...
  homepage ''      # アプリケーションのホームページの url.
  license :unknown # todo: change license and remove this comment; ':unknown' is a machine-generated placeholder

  app ''
end

それぞれを定義していきます.詳細は同ドキュメントの Cask Stanzas に説明があります.

% shasum -a 256 ~/tmp/my-new-cask.dmg | pbcopy  # 結果を直接クリップボードに入れちゃってます.

ちなみに引数で指定するパスは *.dmg および *.zip ファイルのものです..app ではありません. * [url] の取得方法;
ブラウザの "リンクのアドレスをコピー" を使うでも良いですが,こんなのでも取得できるみたいです.

% hdiutil attach ~/tmp/my-new-cask.dmg
% cd /Volume/my-new-cask
% "$(brew --repository)/Library/Taps/caskroom/homebrew-cask/developer/bin/list_url_attributes_on_file" './path/to/my-new-cask.app'

こちらは先の sha256 チェックサム値と違って,指定するパスは *.app ファイルの方.

Step 04. 作成した formula を所定の場所に置いて tap,brew install my-new-cask

$ ls "$(brew --repository)"/Library/Taps
caskroom homebrew github_user
$ mv ~/tmp/my-new-cask.rb /usr/local/Library/Taps/github_user/mycaskroom/Casks/
$ brew tap github_user/mycaskroom
$ brew install my-new-cask
==> Downloading http://www.ooo.ooo/download/my-new-cask.dmg
######################################################################## 100.0%
==> Symlinking App 'my-new-cask.app' to '/Users/yourname/Applications/my-new-cask.app'
🍺  my-new-cask staged at '/opt/homebrew-cask/Caskroom/my-new-cask/latest' (1032 files, 79M)

と言う事でおしまいです.

*1:ダウンロードした dmg を一旦展開し,マウントしたまま app を叩きバージョンを確認しバージョンの値を取得.

*2:ここでは自分用の cask の環境を既に有しているものとして話を進めてます.
もしそうではなく,まったくのゼロから行う手続きについては こちら でレポートしているので,良かったら参考にしてみてください.このエントリーを書いた時から homebrew cask の仕様が変わったりしていたりするので,若干のずれは有りますが...

*3:重複していたら brew cask create の際,エラーではじいてくれますが.