Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

HomebrewのPackageの作成・公開

f:id:tbpg:20160708015252p:plain

HomebrewのPackage作成、公開についてまとめます。ˇ
※この記事は個人メモの意味合いが強く、技術情報としての新規性はありません。
もともと知っている方は特に新たに得られる情報はありません。

Homebrew

Homebrew は Mac 向けのパッケージ管理ソフト。
Rubyで作られています。

Formula とは?

Rubyで書かれたBrewのパッケージ定義。

サンプル

class Wget < Formula
  homepage "https://www.gnu.org/software/wget/"
  url "https://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz"
  sha256 "52126be8cf1bddd7536886e74c053ad7d0ed2aa89b4b630f76785bac21695fcd"

  def install
    system "./configure", "--prefix=#{prefix}"
    system "make", "install"
  end
end

Formula の作成

以下のコマンドで Formula の雛形を生成します。

$ brew create <url>

作成したファイルを保存したリポジトリを以下の命名で作成する。

username/homebrew-xxx

例えば GitHub に tbpgr user で hoge リポジトリを作成する場合は

https://github.com/tbpgr/homebrew-hoge

となる。

Tap とは?

公式以外のリポジトリを Formula として Homebrew に追加することです。

$ brew tap user/repo

private リポジトリ

brew tap はもともとは public GitHub リポジトリだけが対象でした。
そこで brew any-tap が private リポジトリGitHub以外のリポジトリにも対応しました。
その後、 brew any-tapbrew tap に取り込まれたため現在は private リポジトリであることを
気にすることなく利用できます。

https://github.com/telemachus/homebrew-anytap

Package 作成サンプル

Crystal で作成した CLI ツールを brew install できるようにしてみます。
前提としてすでにバイナリは作成済みとします。

Formula の雛形を作成

brew create でひな形を生成します。 作成した fuzzbuzz.rb は user/homebrew-fizzbuzz リポジトリを作成し、pushします。
この際、今回はバイナリもこのリポジトリに保存しました。
(private repository を brew で扱う際の作法がわからず、この方法でしかうまくいかなかった。
もっと良い方法があるだろう)

# Documentation: https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Formula-Cookbook.md
#                http://www.rubydoc.info/github/Homebrew/brew/master/Formula
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!

class Fizzbuzz < Formula
  desc "fizzbuzz"
  homepage "https://github.com/user/fizzbuzz"
  url "https://github.com/user/fizzbuzz/releases/download/v0.1.2/fizzbuzz"
  sha256 ""

  # depends_on "cmake" => :build
  depends_on :x11 # if your formula requires any X11/XQuartz components

  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
    system "make", "install" # if this fails, try separate make/make install steps
  end

  test do
    # `test do` will create, run in and delete a temporary directory.
    #
    # This test will fail and we won't accept that! It's enough to just replace
    # "false" with the main program this formula installs, but it'd be nice if you
    # were more thorough. Run the test with `brew test fizzbuzz`. 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
$ cd homebrew-fizzbuzz
# hub をインストールしてあることが前提
$ git create -p user/fizzbuzz
# バイナリと Formula を git add / commit しておく
$ tree
.
├── fizzbuzz
└── fizzbuzz.rb
$ git push origin master

Formula を編集します

class Fizzbuzz < Formula
  desc "fizzbuzz"
  homepage "https://github.com/user/fizzbuzz"
  url "git@github.com:uesr/homebrew-fizzbuzz.git", :using => :git

  def install
    bin.install "fizzbuzz"
  end
end

tap

$ brew tap user/fizzbuzz git@github.com:user/homebrew-fizzbuzz.git

brew install

$ brew install fizzbuzz
$ fizzbuzz 15
1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz,11,Fizz,13,14,FizzBuzz

参考資料