Homebrew Caskの作り方メモ
HomebrewはmacOSの向けのパッケージマネージャで、インストール可能なパッケージの管理もコミュニティによって保守されている。
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
最初の実装では url
と homepage
のドメインが不一致なため 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である場合には更に以下の項目も確認する。
- Token referenceに準拠した命名であること
- 過去に却下されていないこと
- 対象リポジトリが正しいこと
- 開発版やNightly Buildなどは homebrew-cask-versions に、フォント系は homebrew-cask-fonts、ドライバ系は homebrew-cask-drivers などがある
- 非公式ビルドなどは取り込まれない
brew audit --new-cask <cask>
が通ることbrew install --cask <cask>
が通ることbrew uninstall --cask <cask>
が通ること
こうして作られたのが以下のPull Request。めでたいですね。