Homebrewでの配布は簡単だが毎回忘れる
Goでバイナリ作ったり、ShellScript書いて配布したいなと思ったときにHomebrew使うことが割とある。
が、その都度毎回調べてやり方を思い出しながらするのが億劫だったので、一回まとめてみる。
ざっくり手順
- Homebrew配布用のリポジトリを作る
- tagをpushしてReleaseノートを作る
- 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。
tagをpushできたのでReleaseノートを作る。Homebrewでインストールする先のURLを作る作業。
先程tagを確認したページ内のDraft new release
ボタンをクリックするとReleaseノート編集画面にうつる。
上記画像のように必要項目を埋め、publish release
ボタンをクリック。
下記画像のような感じになればOK。
3. Formulaファイルを作ってpush
後はインストールファイル(Formulaファイル)を作ったら終了。
Formulaファイルを作成するコマンド
brew create https://github.com/Rasukarusan/homebrew-gitblamer/releases/download/0.01/gitblamer
ここで指定するURLは先程作ったReleaseノートのバイナリやShellScriptなどの実行ファイル本体の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回は手動でやったほうが身に染みるよね。