Homebrew Caskの作り方メモ

HomebrewmacOSの向けのパッケージマネージャで、インストール可能なパッケージの管理もコミュニティによって保守されている。

Homebrewで利用可能なパッケージはFormulaと呼ばれ、homebrew-coreで管理されているが、ここはその名の通り自家醸造(homebrew)可能な=ソースコードからビルド可能なパッケージしか取り込まれない。一方でバイナリ配布のみのアプリケーションやGUIアプリケーションを取り扱いたい場合はhomebrew-caskで管理することになる。

Formulaの作成や更新は何度かやっていたけれど、CaskはFormulaとは若干作り方のフローが異なっていたので備忘録として残しておく。なお、Caskは樽を意味して、Formulaは製法を意味する英単語。Caskは既に作られたものを溜めておくので面白い命名である。

Caskの作り方

Caskの作り方はCONTRIBUTING.mdを読む。

既にhomebrew-caskを手元に導入済みの前提で、forkした自分のリポジトリをcaskディレクトリ直下でremoteリポジトリとして登録する。リポジトリパスは各環境に応じたものにしておく。

$ cd "$(brew --repository)"/Library/Taps/homebrew/homebrew-cask
$ git remote add me "https://github.com/castor4bit/homebrew-cask"

今回はSlack CLIを新規登録するためのCaskを作ってみる。まずは作業用branchの作成。

$ git checkout -b add-slack-cli master
$ vi Casks/slack-cli.rb

ここからの作業は Adding Software To Homebrew — Homebrew Documentation を参考に進める。Caskの雛形は brew create コマンドにURLを渡すと自動的に作成してくれる。

$ brew create --cask https://downloads.slack-edge.com/slack-cli/slack_cli_1.14.0_macOS_64-bit.tar.gz --set-name slack-cli

Examplesを参考に各項目を埋めていく。

cask "slack-cli" do
  version "1.14.0"
  sha256 "290b60a3798c13bfc11d815807d2115b8dca62532e9509eef8bfc2e8e1863b4a"

  url "https://downloads.slack-edge.com/slack-cli/slack_cli_#{version}_macOS_64-bit.tar.gz",
    verified: "downloads.slack-edge.com"
  name "Slack CLI"
  desc "CLI to create, run, and deploy Slack apps"
  homepage "https://api.slack.com/future/tools/cli"

  livecheck do
    url "https://api.slack.com/future/tools/cli"
    regex(/href=.*?slack_cli_(\d+\.\d+\.\d+)_macOS_64-bit.tar.gz/)
  end

  depends_on formula: "deno"

  binary "bin/slack"
end

Caskのドキュメントは全般的な説明とCask定義の詳細説明でそれぞれ独立しているので、どちらにも目を通すとよい。

GUIアプリケーションを対象とする場合は app "Slack.app" のように app を利用するが、バイナリ配布のアプリケーションでは binary を利用する。インストール時に自動的に $(brew --prefix)/bin folder(通常は /usr/local/bin)にリンクされる。

depends_on の記法がFormulaとは異なり、caskとformulaのどちらに依存するのかなどを記述する。Formulaのように:recommend:optionalの指定はできない。

今回はアンインストール時の作業用ディレクトリなどないので zap は削除する。

テストする

インストールのテスト

$ brew install slack-cli

アンインストールのテスト

$ brew uninstall slack-cli

定義ファイルのチェック

Caskの記述誤りやルールに沿っているかなどをチェックする。

$ brew audit --new-cask slack-cli

audit for slack-cli: failed
 - The URL's domain downloads.slack-edge.com does not match the homepage domain api.slack.com, a 'verified' parameter has to be added to the 'url' stanza. See https://docs.brew.sh/Cask-Cookbook#when-url-and-homepage-domains-differ-add-verified
 - Version '1.14.0' differs from '' retrieved by livecheck.
 - Version '1.14.0' differs from '' retrieved by livecheck.
Error: 2 problems in 1 cask detected

最初の実装では urlhomepageドメインが不一致なため verified を付加するように指示された。ドメインが異なることは理解した上で指定していることを明示する目的みたい。

さらに、livecheckで取得したバージョンと不一致であると言われていた。livecheckでどのようなチェックが行われているかは brew livecheck --debug で確認できる。以下は livecheck ブロックを何も記述していない状態での出力でバージョン取得に失敗していることが分かる。

$ brew livecheck --debug slack-cli

Cask:             slack-cli
Livecheckable?:   No

URL:              https://downloads.slack-edge.com/slack-cli/slack_cli_1.14.0_macOS_64-bit.tar.gz
Strategy:         None

URL:              https://api.slack.com/future/tools/cli
Strategy:         None
Error: slack-cli: Unable to get versions

修正してバージョン取得に成功することを確認する。

$ brew livecheck --debug slack-cli

Cask:             slack-cli
Livecheckable?:   Yes

URL:              https://api.slack.com/future/tools/cli
Strategy:         PageMatch
Regex:            /href=.*?slack_cli_(\d+\.\d+\.\d+)_macOS_64-bit.tar.gz/

Matched Versions:
1.14.0

slack-cli: 1.14.0 ==> 1.14.0

スタイルチェック

コードフォーマッタで整形する。

$ brew style --fix slack-cli

Pull Requestを送る

$ git add Casks/slack-cli.rb
$ git commit -m "Add Slack CLI v1.14.0
$ git push -u me add-slack-cli 

Pull Requestテンプレートに記載されているいくつかの確認事項を全てチェックして Create pull request を押す。必須の確認事項は以下の3点。

  • 安定版であること(ベータ版のみが配布されていない場合は例外としてOK)
  • brew audit --cask --online <cask> でエラーのないこと
  • brew style --fix <cask> で違反警告のないこと
$ brew audit --cask --online slack-cli
==> Downloading https://downloads.slack-edge.com/slack-cli/slack_cli_1.14.0_macOS_64-bit.tar.gz
Already downloaded: /Users/castor/Library/Caches/Homebrew/downloads/a30cc23554ef08339fed1136f5b83c7fc2593f16b20f32bd21ab6ae66deb42f4--slack_cli_1.14.0_macOS_64-bit.tar.gz
audit for slack-cli: passed
$ brew style --fix slack-cli

1 file inspected, no offenses detected

新規のCaskである場合には更に以下の項目も確認する。

こうして作られたのが以下のPull Request。めでたいですね。

github.com