読者です 読者をやめる 読者になる 読者になる

メモ書き

自分が後で見直すためにつけている作業のメモ書きです.それ以上の意味はありません

Homebrew Cask でバージョン違いのパッケージを作る

homebrew cask でバージョン違いのパッケージをインストールできることはわかった.

nsaito-nmiri.hateblo.jp


ところが,必ずしも都合よくパッケージが存在するわけでもない.
そういう場合は自分で作ってみるしかない.
そのための手順は一応まとめられている.

参考にしたのはこちらqiita.com

で,大元の解説はこちら(上のブログだとコマンド名が一部古くなっているので)

homebrew-versions/CONTRIBUTING.md at master · caskroom/homebrew-versions · GitHub

これをみると,以下を参照しているのでこちらもチェックする必要がある.

homebrew-cask/CONTRIBUTING.md at master · caskroom/homebrew-cask · GitHub

というわけで,手順

ここでは MPEG Streamclip というアプリを例にとる.このアプリは 1.9.2 のみが Homebrew Cask に登録されていて,ベータ版の 1.9.3b については登録されていない.これをインストールできるようにしてみる.

ちなみに,GitHub にユーザ登録していることは前提としておく.github.com

コントリビュートのためのセットアップ

cd $(brew --prefix)/Library/Taps/caskroom/homebrew-versions
git remote add <GitHubのユーザ名> https://github.com/<GitHubのユーザ名>/homebrew-versions

Cask を追加

インストールファイルを確認

インストールしてみたいファイルをダウンロードしてみて,その中身を調べて見る.
例えば,MPEG Streamclip 1.9.3b8 の場合,次のURL からファイルをダウンロードし,dmg ファイルを展開してみる.
http://www.squared5.com/svideo/MPEG_Streamclip_1.9.3b8.dmg

展開すると,「MPEG Streamclip.app」というファイルと 「Utility MPEG2 Component M. Lion.app」というファイル(厳密にはディレクトリなのだけど)の2つが含まれていることがわかる.この .app ファイルがインストールする対象となるファイルである(この場合は2つあるが,個人的には片方だけで十分だったりする).アプリによっては,展開後にさらにサブディレクトリが作られていて,その中に .app ファイルが配置される場合もある.

Cask のためのトークンを生成する

install したり search したりするために使われるアプリ名の文字列を生成する必要がある.
どのような名前をつけたらよいか,名前を提案してくれるためのツールが用意されている.それにパラメータとして先ほど調べた .app のファイル名を与えて実行してみる.

$ "$(brew --repository)/Library/Taps/caskroom/homebrew-cask/developer/bin/generate_cask_token" '/Volumes/MPEG Streamclip 1.9.3b8/MPEG Streamclip.app'
Proposed token:               mpeg-streamclip
Proposed file name:           mpeg-streamclip.rb
Cask Header Line:             cask :v1 => 'mpeg-streamclip' do

WARNING: the file '/usr/local/Library/Taps/caskroom/homebrew-cask/Casks/mpeg-streamclip.rb' already exists. Prepend the vendor name if this is not a duplicate.

出力結果から,名前の候補として mpeg-streamclip を提案していること,およびその名前はすでに登録されていること,がわかる.
同じ名前は作ることができないので,β版であることを示す -beta を末尾につけてみる.

既存のCask ファイルをコピーする.

新規作成の場合は 「brew cask create アプリ名」と実行するらしいのだけど,それをここですると "$(brew --repository)/Library/Taps/caskroom/homebrew-cask/Casks/" の下にファイルが作られる.

今やりたいことは,バージョン違いのパッケージを作りたいので,"$(brew --repository)/Library/Taps/caskroom/homebrew-cask/Casks/" の下にある .rb ファイルを "$(brew --repository)/Library/Taps/caskroom/homebrew-versions/Casks/" の下にコピーする.ファイル名は元の名前とかぶらないようなものにする.

$pwd
/usr/local/Library/Taps/caskroom/homebrew-versions
$ cp ../homebrew-cask/Casks/mpeg-streamclip.rb ./Casks/mpeg-streamclip-beta.rb

そして,mpeg-streamclip-beta.rb を編集する.

元のファイルの内容:

cask :v1 => 'mpeg-streamclip' do
  version '1.9.2'
  sha256 'f539e527a7232a9ac4398c0d3e7730010058b300c8d7fd33c4baf8c9ac232b85'

  # alfanet.it is the official download host per the vendor homepage
  url "http://www.alfanet.it/squared5/MPEG_Streamclip_#{version}.dmg"
  name 'MPEG Streamclip'
  homepage 'http://www.squared5.com/'
  license :unknown    # todo: change license and remove this comment; ':unknown' is a machine-generated placeholder

  app 'MPEG Streamclip.app'
end

編集後:

cask :v1 => 'mpeg-streamclip-beta' do
  version '1.9.3b8'
  sha256 '42459e262e46df81228ef3859aba102d9368be3a5710514a3055dd9f49c2f234'

  url "http://www.squared5.com/svideo/MPEG_Streamclip_#{version}.dmg"
  name 'MPEG Streamclip'
  homepage 'http://www.squared5.com/'
  license :unknown    # todo: change license and remove this comment; ':unknown' is a machine-generated placeholder

  app 'MPEG Streamclip.app'
end

最初の cask の行は,パッケージ名に変更.
version の行については,ダウンロードする url とも関連しているので,ファイル名に合わせることにした.
sha256 の行については,以下のコマンドでチェックサムを計算しなおした.

$ shasum -a 256 ~/Downloads/MPEG_Streamclip_1.9.3b8.dmg 
42459e262e46df81228ef3859aba102d9368be3a5710514a3055dd9f49c2f234  /Users/saito/Downloads/MPEG_Streamclip_1.9.3b8.dmg

書き終わったらファイルを保存して閉じる.
Caskファイルの細かい書き方については以下を参照のこと.github.com

Cask を試す

実際にインストールできるかどうか,試してみる

$ brew cask install mpeg-streamclip-beta
==> Downloading http://www.squared5.com/svideo/MPEG_Streamclip_1.9.3b8.dmg
######################################################################## 100.0%
==> Symlinking App 'MPEG Streamclip.app' to '/Users/saito/Applications/MPEG Stre
🍺  mpeg-streamclip-beta staged at '/opt/homebrew-cask/Caskroom/mpeg-streamclip-beta/1.9.3b8' (42 files, 3.5M)

すべて順調そうなら,以下のようにしてチェックしてみる.passed とあればOK

$ brew cask audit mpeg-streamclip-beta --download
==> Downloading http://www.squared5.com/svideo/MPEG_Streamclip_1.9.3b8.dmg
Already downloaded: /Library/Caches/Homebrew/mpeg-streamclip-beta-1.9.3b8.dmg
audit for mpeg-streamclip-beta: passed

ここでローカルリポジトリの状態を確認

リポジトリの状態を確認してみると,先ほどコピーしたファイルがリポジトリに追加されていない状態であることがわかる.

$ cd /usr/local/Library/Taps/caskroom/homebrew-versions
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	Casks/mpeg-streamclip-beta.rb

nothing added to commit but untracked files present (use "git add" to track)

コミットする

masterブランチにファイルを追加せず,作成パッケージ用の新規ブランチを作り,それからファイルを追加して,コミットする.

$ git checkout -b 'mpeg-streamclip-beta'
Switched to a new branch 'mpeg-streamclip-beta'
$ git add Casks/mpeg-streamclip-beta.rb 
$ git commit -v

次のような,メッセージ編集画面が表示されるので,メッセージを記述する.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch mpeg-streamclip-beta
# Changes to be committed:
#       new file:   Casks/mpeg-streamclip-beta.rb
#
# ------------------------ >8 ------------------------
# Do not touch the line above.
# Everything below will be removed.
diff --git a/Casks/mpeg-streamclip-beta.rb b/Casks/mpeg-streamclip-beta.rb
new file mode 100644
index 0000000..2c04523
--- /dev/null
+++ b/Casks/mpeg-streamclip-beta.rb
@@ -0,0 +1,11 @@
+cask :v1 => 'mpeg-streamclip-beta' do
+  version '1.9.3b8'
+  sha256 '42459e262e46df81228ef3859aba102d9368be3a5710514a3055dd9f49c2f234'
+
+  url "http://www.squared5.com/svideo/MPEG_Streamclip_#{version}.dmg"
+  name 'MPEG Streamclip'
+  homepage 'http://www.squared5.com/'
+  license :unknown    # todo: change license and remove this comment; ':unknown' is a machine-generated placeholder
+
+  app 'MPEG Streamclip.app'
+end

コミットメッセージの書き方として,次のような書き方がオススメらしい

  • 最初の行はコミットのまとめ.50文字以下で.
  • 次に空行を続ける
  • 次にコミットの説明を続ける.72文字で折り返すように

ということで,次のようにしてみた.

    Add a new version of the Cask "mpeg-streamclip".
    
    * MPEG Streamclip 1.9.3b8

# Please enter the commit message for your changes. Lines starting
(以下略)

メッセージを書いたら,保存してエディタを終了.
これで(ローカルの)コミットは完了した.

homebrew-versions を Fork

GitHub にログインして,caskroom/homebrew-versions · GitHub をフォークする.
自分のリポジトリに,フォークされた homebrew-versions ができる.

コミットをプッシュする

先ほど Fork した homebrew-versions に,mpeg-streamclip-beta のブランチをプッシュする.

$ git push <ユーザ名> mpeg-streamclip-beta
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 675 bytes | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
To https://github.com/<ユーザ名>/homebrew-versions
 * [new branch]      mpeg-streamclip-beta -> mpeg-streamclip-beta

pull request を送る.

caskroom/homebrew-versions · GitHub のページに移り,プルリクエストを送信する.

以上.