【備忘録】Homebrewで自作ツールを配布する

f:id:rasukarusan:20191103211239p:plain

Homebrewでの配布は簡単だが毎回忘れる

Goでバイナリ作ったり、ShellScript書いて配布したいなと思ったときにHomebrew使うことが割とある。
が、その都度毎回調べてやり方を思い出しながらするのが億劫だったので、一回まとめてみる。

ざっくり手順

  1. Homebrew配布用のリポジトリを作る
  2. tagをpushしてReleaseノートを作る
  3. Formulaファイルを作ってpush

1. Homebrew配布用のリポジトリを作る

自作ツールのインストールファイルを置くためのリポジトリを作る。このリポジトリにバイナリとかの成果物を置くわけではない。置くのはインストールファイルである.rbのみ。このリポジトリはbrew tap XXXXX/YYYYするときに指定するやつ。

1つ注意したいのは、リポジトリを作る際プレフィックス名はhomebrew-にしておく。これは守らないといけない。今回はhomebrew-tapというリポジトリ名にした。

$ mkdir homebrew-tap
# インストールファイルを格納するFormulaディレクトリを作っておく
$ mkdir homebrew-tap/Formula

# ディレクトリ構造。READMEは別になくていい。
~/Desktop/homebrew-tap  master ✔
$ tree
.
|-- Formula
`-- README.md

Githubで見るとこんな感じ。Formula内のファイルは後で作成するから今は気にしない。

GitHub - Rasukarusan/homebrew-tap

2. tagをpushしてReleaseノートを作る

配布したいツールのリポジトリでtagをpushする。

$ git tag 0.0.1
$ git push origin 0.0.1

今回は例としてこのリポジトリで行った。

~/homebrew-gitblamer  master ✔
$ git tag 0.0.1

~/homebrew-gitblamer  master ✔
$ git push origin 0.0.1
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/Rasukarusan/homebrew-gitblamer.git
 * [new tag]         0.0.1 -> 0.0.1

Releaseタブをクリックして0.0.1が登録されていればOK。

f:id:rasukarusan:20191103203444p:plain:w500
Releaseタブで確認

f:id:rasukarusan:20191103203519p:plain:w500
0.0.1のtagが登録されていればOK

tagをpushできたのでReleaseノートを作る。Homebrewでインストールする先のURLを作る作業。
先程tagを確認したページ内のDraft new releaseボタンをクリックするとReleaseノート編集画面にうつる。

f:id:rasukarusan:20191103203609p:plain:w500
Releaseノートを作る

上記画像のように必要項目を埋め、publish releaseボタンをクリック。
下記画像のような感じになればOK。

f:id:rasukarusan:20191103203636p:plain:w500
Releaseノート作成完了

3. Formulaファイルを作ってpush

後はインストールファイル(Formulaファイル)を作ったら終了。

Formulaファイルを作成するコマンド

brew create https://github.com/Rasukarusan/homebrew-gitblamer/releases/download/0.01/gitblamer

ここで指定するURLは先程作ったReleaseノートのバイナリやShellScriptなどの実行ファイル本体のURL。

f:id:rasukarusan:20191103204134p:plain:w500
実行ファイル本体のURLをコピー

コマンドを実行すると下記のようなファイルがvimで開かれる。

# Documentation: https://docs.brew.sh/Formula-Cookbook
#                https://rubydoc.brew.sh/Formula
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
class Gitblamer < Formula
  desc "指定したユーザーの編集したファイルを全て出力するシェルスクリプト。"
  homepage ""
  url "https://github.com/Rasukarusan/gitblamer/releases/download/0.01/gitblamer"
  sha256 "8627dfae4335cbcfc1de18df4e08cc4a571c27d1c9065119b7ffc9139041c536"

  # depends_on "cmake" => :build

  def install
    # ENV.deparallelize  # if your formula fails when building in parallel
    # Remove unrecognized options if warned by configure
    system "./configure", "--disable-debug",
                          "--disable-dependency-tracking",
                          "--disable-silent-rules",
                          "--prefix=#{prefix}"
    # system "cmake", ".", *std_cmake_args
  end

  test do
    # `test do` will create, run in and delete a temporary directory.
    #
    # This test will fail and we won't accept that! For Homebrew/homebrew-core
    # this will need to be a test that verifies the functionality of the
    # software. Run the test with `brew test gitblamer`. Options passed
    # to `brew install` such as `--HEAD` also need to be provided to `brew test`.
    #
    # The installed folder is not in the path, so use the entire path to any
    # executables being tested: `system "#{bin}/program", "do", "something"`.
    system "false"
  end
end

リポジトリに説明文を書いていれば勝手に挿入される。巷でよく書かれているsha256も自動で作成される。 自動で作成されなかったら下記コマンドでsha256を作成して挿入する。別に空っぽでも大丈夫だった気がする。

$ openssl dgst -sha256 gitblamer

Formulaファイルを編集する。いらない箇所は削除し、今回の場合は実行ファイルをインストールしたいのでbin.installを記載する。諸々削除して最終的なものは以下。

class Gitblamer < Formula
  desc "指定したユーザーの編集したファイルを全て出力するシェルスクリプト。"
  homepage ""
  url "https://github.com/Rasukarusan/gitblamer/releases/download/0.01/gitblamer"
  sha256 "8627dfae4335cbcfc1de18df4e08cc4a571c27d1c9065119b7ffc9139041c536"

  def install
    bin.install "gitblamer"
  end
end

このファイルを手順1で作ったhomebrew-tapリポジトリにのFormulaディレクトリ内に入れる。ファイル自体を移動させてもいいし、コピーして新たにファイルを作っても良い。

最終的にはこんなディレクトリ構造になっているはず。

~/Desktop/homebrew-tap  master ✗
$ tree
.
|-- Formula
|   `-- gitblamer.rb
`-- README.md

あとはpushして終了。

~/Desktop/homebrew-tap  master ✔
$ git push origin master

インストールできるか試してみる

$ brew tap Rasukarusan/tap
$ brew install Rasukarusan/tap/gitblamer

インストールしたコマンドが使えるかも確認する

$ gitblamer
/Users/rasukaru/Desktop/homebrew-tap/Formula/fzf-crhome-active-tab.rb
/Users/rasukaru/Desktop/homebrew-tap/Formula/gitblamer.rb

Total 2 file found!

OK!!

死ぬほど参考にしたサイト

特にこの下のサイト、homebrew-XXXのリポジトリを1つにまとめることができるって初めて知ったので、ハイパーリスペクトを贈りたい。ありがとうございます。

今回使用したGithubリポジトリ

自分が配布したいツール github.com

配布するために必要なリポジトリ(今後配布したいツールが現れたらここに.rbファイルを追加していく) github.com

終わり

文章で書くと長いが、めちゃくちゃ簡単に自作ツールが配布できるのでHomebrewは偉大。 たぶんここまでの道のりを楽にするツールとか探せばいっぱいあると思うけど、1回は手動でやったほうが身に染みるよね。