HomeBrewで自作ツールを配布する

複数プラットフォームにGoアプリケーションを配布する

上の記事で,Go言語で作ったツールを複数プラットフォーム向けにクロスコンパイルし,作成されたバイナリをBintrayでホストするまではできた.あとは,ダウンロード・展開・PATHを通す,をやってもらえば,自分の作ったツールを使ってもらえる.

OSX向けにツールを配布する場合はHomeBrewのFormulaを作っておけば,これをもっと簡単にできる.

TL;DR

以下でインストールできるようにする.

$ brew tap <ユーザ名>/<パッケージ名>
$ brew install <パッケージ名>

ただし作成したツールが,GithubのリリースページやBintrayにホストされていることを前提とする.

Formulaの作成

Formulaとは,HomebrewでインストールするパッケージのURLやビルドの手順が書かれたスクリプト.Homebrewでインストールできるツールは全てこのFormulaが準備されていて,それらは全て/usr/local/Library/Formula以下にある.Formulaは単純なRubyのDSLで簡単に書ける.

まず,Formulaの雛形をつくる.

$ brew create <URL>

これを実行すると,URLに基づいた名前でFormulaの雛形が作られる.例えば,http://example.com/foo-0.1.tar.gzだと,foo.rbが作られる.雛形は以下のようになる.

require "formula"

class Foo < Formula
  url "http://example.com/foo-0.1.tar.gz"
  homepage ""
  sha1 "1234567890ABCDEF1234567890ABCDEF"

 # depends_on "cmake" => :build

  def install
      system "./configure", "--prefix=#{prefix}", "--disable-debug", "--disable-dependency-tracking"
      #system "cmake", ".", *std_cmake_args
      system "make install"
  end
end

あとは,これを編集するだけ.使えるDSLはここを見るとよい.systemが使えるのでやりたい放題といえばやりたい放題.

DSLを書く

ここでは,最低限使えそうなものを紹介する.

Go言語のクロスコンパイルではamd64386のバイナリをそれぞれ作れるので,それに応じてインストールURLを変更できるようにする.これにはHardware.is_64_bit?を使う.以下のように書ける.

if Hardware.is_64_bit?
    url "http://exmaple.com/foo_amd64.zip"
    sha1 "dce04210f14dcff0c7863e14695986e02ada4e02"
else
    url "http://exmaple.com/foo_386.zip"
    sha1 "3226bdbcaf982e03d88f881878a1076d6ffbe423"
end

バイナリをPATHが通っているディレクトリに配置するにはbin.installを使う.パッケージは基本的に/usr/local/Cellar以下にダウンロード・展開される.bin.installは,Cellarから/usr/local/binに対してシンボリックリンクを貼ってくれる.

def install
    bin.install '<バイナリ名>'
end          

/usr/local/etc等にもリンクをはることができる.

インストール完了後に,メッセージを表示した場合は,caveats関数を準備する.例えば,「xxxを.bashrc.zshrcに書いてください」といった文言を表示したいとき.

def caveats
     msg = <<-EOF.undent
Add the following line to your ~/.bash_profile or ~/.zshrc file (and remember to source the file to update your current session):
[[ -s `brew --prefix`/etc/jj.sh ]] && . `brew --prefix`/etc/jj.sh
EOF
end

最終的に自分が書いたFormulaはこちら

テストする

Formulaができたらいつも通りbrewコマンドを叩いてテストする.brew installを実行しても,brew uninstallすれば貼られたシンボリックリンクは消される.DSLを使う限り動作は全て/usr/local/binで完結するので,調査もしやすい.Formulaそのものを消したければgit checkoutしてしまえばよい.

Tap

公式のレポジトリに取り込んでもらいたい場合は,そのままブランチを切ってPull requestを送る.

公式に取り込まれるのに腰が引ける場合は,自分用のGithubレポジトリを作り,その中にFormulaをぶっ込む.レポジトリ名はhomebrew-<レポジトリ名>とする.例えば,上の例で言うと,foo.rbhomebrew-fooレポジトリに入れて公開する.あとはユーザに以下を実行してもらえば,自分のFormulaをHomeBrewのインストール対象にすることができる.

$ brew tap <ユーザ名>/<レポジトリ名>

tapもやっていることは単純で,/usr/local/Library/Taps以下にレポジトリをcloneしてきて,/usr/local/Library/Formulaに対してシンボリックリンクを貼っているだけ.