年中アイス

いろいろつらつら

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で配布する場合は、以下の記事の方が簡単に行えます。

reiki4040.hatenablog.com

追記ここまで

  • brew createでひな形作成
  • 必要な手順を加える
  • インストール確認
  • 自分のリポジトリを作ってpush
  • tapしてインストール確認
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同様変数で分けます。また、この部分に限らずですが、MacLinux、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-rnzoobrew 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もできたようなので、簡単に配布できそうです。もちろん、そのプラットフォームに対応していればの話ですが。