homebrewで自作のバイナリを配布する。
rnzooのインストールを簡略化するために、homebrew経由で、インストールできるようにしたのでその時のメモ。
rnzooがhomebrewで入れられるようになりました。 - 年中アイス
※2014/11/5 versionの指定をミスしていたので修正
homebrewとは
homebrewはmac向けのパッケージ管理ツールです。最近Linuxにも対応?fork?したようです。*1
Formulaという単位で、ツールとインストール情報を定義し、それを指定して、インストールや依存の解決を行っています。
通常、homebrewでインストールできるようにするためには、公式のリポジトリに、Formulaをプルリクする必要があります。ただ、これを行わなくても、自分で作ったリポジトリにFormulaを置いて、brew tapというコマンドで、取り込むことができます。yum/aptに追加リポジトリを登録するのと同じ感じです。
作ってみた
pecoで使われていて、簡単だということだったので、やってみました。日本語での情報は少ないものの、Formulaの書き方自体は公式のリポジトリ*2にいっぱいあるので参考にはなると思います。
私はだいぶpecoのFormulaを参考にしました。
https://github.com/peco/homebrew-peco/blob/master/peco.rb
出来上がったrnzooがこちら。
homebrew-rnzoo/rnzoo.rb at master · reiki4040/homebrew-rnzoo · GitHub
作り方
※2020/02/22 追記
Goのツールをhomebrewで配布する場合は、以下の記事の方が簡単に行えます。
追記ここまで
brew createでひな形作成
brew createするとFormula用のrubyファイルが作られます。
brew create http://example.com/foo-0.1.tar.gz
自動でエディタが立ち上がりますが、ファイルの作成先は、/usr/local/Library/Formula/以下、ファイル名は、url末尾のファイル名の先頭部分?が自動で切りだされます。この例だとfoo.rbです。
必要な手順を加える
作成されたひな形には、いろいろなコメントやブロックがありますが、一旦使わないのは無視して、今回使うものだけにしぼります。以下がrnzooのformulaです。
require "formula" HOMEBREW_RNZOO_VERSION="0.2.0" class Rnzoo < Formula homepage 'https://github.com/reiki4040/rnzoo' if OS.mac? url "https://github.com/reiki4040/rnzoo/releases/download/#{HOMEBREW_RNZOO_VERSION}/rnzoo-#{HOMEBREW_RNZOO_VERSION}-darwin-amd64.zip" sha1 '203853d469537d925d90a25bdb9112e7e395b0ec' end version HOMEBREW_RNZOO_VERSION depends_on 'peco' def install # rnssh, ec2list, ltsv_pipe bin.install Dir['bin/*'] end # show message after installation. def caveats msg = <<-EOF.undent # rnzoo need AWS access key for working. # Please set environment variable for AWS connection. # (~/.bashrc, ~/.zshrc or other.) export AWS_ACCESS_KEY_ID="YOUR AWS ACCESS KEY" export AWS_SECRET_ACCESS_KEY="YOUR AWS SECRET ACCESS KEY" # Option: you can set default aws region. export AWS_REGION="ap-northeast-1" EOF end end
- クラス名
自分のツールの名称に合わせるのが良さそうです。
- homepage
brew homeで開かれるURLを指定します。
rnzooはgithubのリポジトリを指定しています。github.ioやwiki等、他に紹介ページ等あればそれを指定しても良いと思います。
アーカイブの指定。sha1でハッシュのチェックができます。(md5もあります)
バージョンによって異なるURLを用意しているので、peco同様変数で分けます。また、この部分に限らずですが、MacやLinux、32/64bit等の判断ができるようです。
- version
バージョン指定、ここを見てhomebrewはアップデートの判断をします。
※2014/11/5間違っていたので修正
version=HOMEBREW_RNZOO_VERSION
version HOMEBREW_RNZOO_VERSION
間の=は不要でした。
- depends_on
依存のあるFormulaがあれば、名称を指定。rnzooの場合は、pecoが必要なので記述しています。
- install method
インストール手順です。標準でDSLが用意されており、それを利用しています。ここでは、urlに指定したアーカイブがダウンロード、解凍され、そのディレクトリ内に移動した状態になるようです。
bin.installは、homebrewが使っているパスに、symlinkを張るDSLです。
Dir['bin/*']は、対象ディレクトリ内の指定なので、bin以下のファイルすべてのsymlinkを作り、PATHが通っているようにさせます。
rnzooのアーカイブ内は以下のような感じなので、'bin/*'で、rnssh, ec2list, ltsv_pipeの3つがsymlink対象になります。
rnzoo-darwin-amd64 <- 解凍時に作成されるディレクトリ |- bin | |- rnssh | |- ec2list | -- ltsv_pipe | |- README.md -- LICENSE
- caveats method
インストール後に表示したいメッセージがあればここに記述します。これは、brew infoでもcaveatsという項目で後で確認することができます。
rnzooの場合は、AWSの接続に必要な環境設定があるので、それを書いています。
- その他
pecoにあるbuild.head?は、brew installの--headオプションへの対応で、pecoの場合は、最新のマスタをcloneして、go buildしたpecoを入れるようになっているようです。rnzooは、特にまだ対応はしていません。
インストール確認
brew createで作っていたら、ローカルではbrew installできるので、デバッグオプション付きで実行して確認してみます。
brew install --verbose --debug foo
やり直す時は一旦削除。今回の内容は、アーカイブからsymlink張るだけなので以下で大丈夫そうです。
brew uninstall foo
自分のリポジトリを作ってpush
tap用のリポジトリを作ります。homebrew-fooというようにhomebrew-というprefixが必要です。この後に続けた文字列がtapする時の名称になります。
rnzooの場合だと、以下です。
https://github.com/reiki4040/homebrew-rnzoo ↓ brew tap reiki4040/rnzoo
これをcloneしてきて、brew createで作られた、/usr/local/Library/Formula/以下にあるファイルを持ってきます。
ファイル名がbrew install等で指定するFormulaの名称になるようです。
あとは、commitしてpushします。
tapしてインストール確認
実際に、tapして確認。
brew tap you/foo brew install foo
もし、失敗したら、エラー見て修正しましょう。私は、urlをシングルクオートで囲むように変更してしまって、変数展開されないバグが起きてました。
まとめ
実行できる状態のファイルの配布と、PATHが通った状態にするのは、簡単にできるので、golangや、shellで作られたツールは使わない手はないと思います。linux版のhomebrewもできたようなので、簡単に配布できそうです。もちろん、そのプラットフォームに対応していればの話ですが。