HomebrewのPackage作成、公開についてまとめます。ˇ
※この記事は個人メモの意味合いが強く、技術情報としての新規性はありません。
もともと知っている方は特に新たに得られる情報はありません。
Homebrew
Homebrew は Mac 向けのパッケージ管理ソフト。
Rubyで作られています。
Formula とは?
サンプル
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-tap
が brew 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 で扱う際の作法がわからず、この方法でしかうまくいかなかった。
もっと良い方法があるだろう)
- fizzbuzz.rb
# 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