9/3 の勉強会で Homebrew について発表したので、その内容を公開します。

man や公式ドキュメントの抜粋を和訳した程度の内容ですが、何かの助けになれば幸いです。

2011/02/23 追記 : 草稿的に書いた私的な wiki ページを残してありますが、同一人(koshigoe)によるものです。

Table of Contents

  • 1 何の話?
  • 2 Homebrew
  • 3 インストール
  • 4 語彙
    • 4.1 Formula
    • 4.2 Keg
    • 4.3 Celler
  • 5 まずは
  • 6 コマンド紹介(標準コマンド編)
    • 6.1 $ brew search text
    • 6.2 $ brew search /regex/
    • 6.3 $ brew install [options] formula
    • 6.4 $ brew install --interactive [--git] formula
    • 6.5 $ brew list
    • 6.6 $ brew formula
    • 6.7 $ brew info formula
    • 6.8 $ brew info --github formula
    • 6.9 $ brew info --all
    • 6.10 $ brew info URL
    • 6.11 $ brew home
    • 6.12 $ brew formula
    • 6.13 $ brew remove formula
    • 6.14 $ brew link formula
    • 6.15 $ brew unlink formula
    • 6.16 $ brew prune
    • 6.17 $ brew outdated
    • 6.18 $ brew deps [--1] formula
    • 6.19 $ brew uses [--installed] formula
    • 6.20 $ brew doctor
    • 6.21 $ brew cat formula
    • 6.22 $ brew cleanup [formula]
    • 6.23 $ brew update
    • 6.24 $ brew create [--cache] URL
    • 6.25 $ brew crewate --macports|--fink formula
    • 6.26 $ brew edit formula
    • 6.27 $ brew edit
  • 7 Formula を自作する
    • 7.1 Gist ファイルの Formula を作ってみる
    • 7.1.1 手順
    • 7.1.2 コマンド履歴
    • 7.1.3 ScriptFileFormula
    • 7.1.4 GithubGistFormula
  • 8 コマンド紹介(外部コマンド編)
    • 8.1 $ brew audit [formula]
    • 8.2 $ brew fetch formula
    • 8.3 $ brew man
    • 8.4 $ brew missing
    • 8.5 $ brew server
    • 8.6 $ brew test formula
    • 8.7 $ brew graph
  • 9 Formula Cookbook から抜粋メモ
    • 9.1 約束事
    • 9.2 Commit
    • 9.3 Push
    • 9.4 インストールの手続き
    • 9.5 ユーティリティ紹介
    • 9.5.1 bin.install(paths)
    • 9.5.2 inplace path, before, after
    • 9.5.3 patches
    • 9.5.4 HEAD
    • 9.5.5 download_strategy
    • 9.5.6 prefix.install(paths)
    • 9.5.7 変数など
    • 9.5.8 keg_only
  • 10 環境変数一覧
  • 11 メモ
  • 12 参考

1 何の話?

Mac OSX に含まれていないコマンド類をインストールするためのパッケージ管理システムについての話。 「できる限り Apple が用意した組み込みのコマンド(パッケージ)を使う」という方針。 Ruby で記述されている。

2 Homebrew

(訳) home-brew: 自家醸造飲料(ビール、酒)

3 インストール

$ ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)"
  1. /usr/local/ 以下のパーミッションを調整
  2. リポジトリから tar ボールをダウンロード
  3. tar ボールを /usr/local/ 以下に展開
  4. 詳しくは

http://gist.github.com/raw/323731/install_homebrew.rb

4 語彙

4.1 Formula

(和訳) 調理法 (用語) パッケージの説明書

4.2 Keg

(和訳) 小たる、たるビール (用語) Formula のインストール先パス

4.3 Celler

(和訳) 地下貯蔵室 (用語) Keg 群のインストール先パス

5 まずは

  • Formula のアップデートなどに git を使うので、git を入れておくと便利。
  • home コマンドを実行すると Homebrew のホームページをブラウザで開くので、目を通しておくとよい。
  • 実際にコマンドで何ができるかは man ページに目を通しておくとよい。
$ brew install git
$ brew update
$ brew home
$ man brew

6 コマンド紹介(標準コマンド編)

6.1 $ brew search text

指定文字列( text )の部分マッチで Formula を検索する。

6.2 $ brew search /regex/

指定正規表現のマッチングで Formula を検索する。

6.3 $ brew install [options] formula

6.4 $ brew install --interactive [--git] formula

  • --interactive ダウンロードして展開した後、シェルを開いて対話的なインストール作業を実施できる。
  • --git パッチ作りなどに役立てるために git リポジトリを作る。

6.5 $ brew list

インストール済みの全ての Formula を表示する。

6.6 $ brew formula

その formula のインストール済みファイルを表示する。

6.7 $ brew info formula

その formula についての情報を表示する。

6.8 $ brew info --github formula

その formula の github の履歴ページをブラウザで開く。

6.9 $ brew info --all

全ての Formula の情報のサマリを表示する。

6.10 $ brew info URL

http:// 始まりの URL を指定すると、その URL からパッケージ名とバージョン番号を推測して表示する。

6.11 $ brew home

Homebrew のホームページをブラウザで開く。

6.12 $ brew formula

その formula のホームページをブラウザで開く。

6.13 $ brew remove formula

その formula を削除(アンインストール)する。

6.14 $ brew link formula

その formula のインストールされたファイルにリンクする。

6.15 $ brew unlink formula

その formula のインストールされたファイルへのリンクを解除する。

6.16 $ brew prune

デッドリンクになっているものを削除する。

6.17 $ brew outdated

アップデートがある Formula の一覧を表示する。

6.18 $ brew deps [--1] formula

その formula の依存関係を表示する。--1 をつけた場合、一階層の依存関係のみを表示。

6.19 $ brew uses [--installed] formula

その formula に依存している Formula を表示する。 --installed をつけた場合、インストール済みの Formula のみを表示する。

6.20 $ brew doctor

システムの潜在的な問題を報告する。

6.21 $ brew cat formula

その formula のファイル内容を表示する。

6.22 $ brew cleanup [formula]

古いバージョンの Formula を削除する。 formula が指定されれば、その formula についてのみ。

6.23 $ brew update

git を使って Homebrew および Formula の新しいバージョンにアップデートする。

6.24 $ brew create [--cache] URL

パッケージのソースアーカイブの URL を指定して Formula を作成する。

6.25 $ brew crewate --macports|--fink formula

MacPorts か Fink のパッケージ検索結果ページをブラウザで開く。

6.26 $ brew edit formula

指定した formula をエディタで開く。

6.27 $ brew edit

全ての Formula を TextMate(mate) で開く。

7 Formula を自作する

http://wiki.github.com/mxcl/homebrew/formula-cookbook

7.1 Gist ファイルの Formula を作ってみる

7.1.1 手順

  1. create すると環境変数 EDITOR で指定されているエディタで Formula ファイル(ひな形)が開くので、ソフトウェアのホームページの URL などを記入する (環境変数 HOMEBREW_EDITOR を設定していれば、そのエディタで開く) パッケージ名やバージョン番号の推測が期待通りでなければ修正する。 (Formula のファイルはパッケージ名に依存するので、必要に応じて変更しておく)
  2. fetch コマンドを使うとハッシュを調べられる (ダウンロード後のファイルでハッシュ値を得ていいのかという話は別)
  3. ハッシュ値を記入する
  4. install メソッドにインストールの手続きを書く
  5. インストールしてみる

7.1.2 コマンド履歴

$ brew create http://gist.github.com/raw/227178/d03bb254c9a28206d6ed516947e1893472ab9558/mymemcheck.rb
Formula name [mymemcheck]:
... edit Formula file ...
require 'formula'

class Mymemcheck <Formula
  url 'http://gist.github.com/raw/227178/d03bb254c9a28206d6ed516947e1893472ab9558/mymemcheck.rb'
  homepage ''
  md5 ''

  # depends_on 'cmake'

  def install
    system "./configure", "--disable-debug", "--disable-dependency-tracking",
                          "--prefix=#{prefix}"
    # system "cmake . #{std_cmake_parameters}"
    system "make install"
  end
end
$ brew cat mymemcheck
require 'formula'

class Mymemcheck <Formula
  url 'http://gist.github.com/raw/227178/d03bb254c9a28206d6ed516947e1893472ab9558/mymemcheck.rb'
  homepage 'http://gist.github.com/227178'
  md5 ''
  version '0.0.1'

  # depends_on 'cmake'

  def install
    system "./configure", "--disable-debug", "--disable-dependency-tracking",
                          "--prefix=#{prefix}"
    # system "cmake . #{std_cmake_parameters}"
    system "make install"
  end
end
$ brew fetch mymemcheck
==> Downloading http://gist.github.com/raw/227178/d03bb254c9a28206d6ed516947e1893472ab9558/mymemcheck.rb
######################################################################## 100.0%
MD5: 44c84bde2574a1e6f125a81aa4e8ca57
SHA1: 8100730d0bf26c2d374aba2ceb5f8e1b4fc73069
$ brew edit mymemcheck
$ brew cat mymemcheck
require 'formula'

class Mymemcheck <Formula
  url 'http://gist.github.com/raw/227178/d03bb254c9a28206d6ed516947e1893472ab9558/mymemcheck.rb'
  homepage 'http://gist.github.com/227178'
  sha1 '8100730d0bf26c2d374aba2ceb5f8e1b4fc73069'
  version '0.0.1'

  # depends_on 'cmake'

  def install
    system "./configure", "--disable-debug", "--disable-dependency-tracking",
                          "--prefix=#{prefix}"
    # system "cmake . #{std_cmake_parameters}"
    system "make install"
  end
end
require 'formula'

class Mymemcheck <Formula
  url 'http://gist.github.com/raw/227178/d03bb254c9a28206d6ed516947e1893472ab9558/mymemcheck.rb'
  homepage 'http://gist.github.com/227178'
  sha1 '8100730d0bf26c2d374aba2ceb5f8e1b4fc73069'
  version '0.0.1'

  def install
    bin.install Dir['*']
  end
end
$ brew install -vd mymemcheck
$ which mymemcheck.rb
/usr/local/bin/mymemcheck.rb

7.1.3 ScriptFileFormula

スクリプトファイルを /usr/local/bin> にリンクするだけなら、Formula の代わりに ScriptFileFormula を継承すると簡単。

# see ack.rb for an example usage
class ScriptFileFormula <Formula
  def install
    bin.install Dir['*']
  end
end

7.1.4 GithubGistFormula

スクリプトファイルを gist から持ってくるなら、Formula の代わりに GithubGistFormula を継承すると簡単。

# see flac.rb for example usage
class GithubGistFormula <ScriptFileFormula
  def initialize name=' __UNKNOWN__'
    super name
    @version=File.basename(File.dirname(url))[0,6]
  end
end

8 コマンド紹介(外部コマンド編)

brew-{command} という名前の実行可能ファイルか、brew-{command}.rb という Ruby スクリプトが、PATH からたどることが出来るなら、 command を外部コマンドとして実行できる。 実行可能ファイルは exec で実行され、ruby スクリプトファイルは、require によって実行される。

8.1 $ brew audit [formula]

指定した formula か全ての Formula が Homebrew のコーディングスタイルに違反していないか検査する。

8.2 $ brew fetch formula

その formula の tarball をダウンロードするか VCS からチェックアウトする。MD5 と SHA1 のチェックサムも表示。

8.3 $ brew man

man ページを再構築する。

ronn が必要。

8.4 $ brew missing

依存関係が失われた Formula を調べる。

8.5 $ brew server

利用可能な Formula をブラウズするサーバアプリを立ち上げる。

sinatra が必要。

8.6 $ brew test formula

test メソッドを実装している Formula について、テストを実行する。

8.7 $ brew graph

グラフデータを出力。

9 Formula Cookbook から抜粋メモ

9.1 約束事

  • インストールで使うコマンドは絶対パスで指定すること
  • マニュアルは {$prefix}/share/man/ 以下に書き出すように
  • Formula のファイル名とクラス名
    • /[-_.\s]/ で分割しキャメルケースに変換したものがクラス名 (+ という文字は x に置換される)
    • クラス名の逆がファイル名

9.2 Commit

  • コミットメッセージの先頭行は 50 文字以内
  • 一行あけて、三行目に説明を書く
$ cd /usr/local
$ git add Library/Formula/foo.rb
$ git commit

9.3 Push

  • Homebrew を fork して使う
  • pull request より issue ticket
$ gem install github
$ cd `brew --prefix`
$ github fork
$ git push myname master

9.4 インストールの手続き

  1. Formula.download_strategy でインスタンス作成
  2. DownloadStrategy.fetch でダウンロード
  3. サンドボックス (/tmp/homebrew) が作られる
  4. DownloadStrategy.stage で展開
  5. パッチ適用
  6. カレントディレクトリを stage ディレクトリに変更 (make コマンドなど、カレントディレクトリに依存するケースに対応)
  7. Formula.install
  8. keg にインストールされるだけ
  9. Homebrew のプレフィクスから keg にリンクする
  10. 注意事項が表示される

9.5 ユーティリティ紹介

9.5.1 bin.install(paths)

指定したパスにマッチするものを keg の bin/ にインストールする。

9.5.2 inplace path, before, after

path にあるファイルの中身の before から after に書き換える。

9.5.3 patches

patches メソッドを定義して、その戻り値で当てたいパッチを文字列や Hash で指定できる。

9.5.4 HEAD

install 時に --HEAD オプションを指定すると trunk/master/HEAD をチェックアウトする。 そのときに使うリポジトリの URL を head メソッドで指定しておく。

class Foo < Formula
  head 'git://github.com/mxcl/lastfm-cocoa.git'
end

9.5.5 download_strategy

ダウンロード方法を指定する。

class Bar < Formula
  def download_strategy; GitDownloadStrategy; end
  head '/users/abc/src/git.git'
end

9.5.6 prefix.install(paths)

コンパイル不要でコピーするだけの様な場合に使える。

prefix.install ['file1', 'file2']
prefix.install Dir['*']

9.5.7 変数など

変数名 デフォルト値 例示
name Formula の名前 foo
HOMEBREW_PREFIX /usr/local
prefix #{HOMEBREW_PREFIX}/Cellar/#{name}/#{version} /usr/local/Cellar/foo/0.1
bin #{prefix}/bin /usr/local/Cellar/foo/0.1/bin
lib #{prefix}/lib etc.
man #{prefix}/share/man

9.5.8 keg_only

/usr/local/bin などへリンクせず、keg で止める。

10 環境変数一覧

  • HOMEBREW_DEBUG
  • HOMEBREW_DEBUG_INSTALL
  • HOMEBREW_DEBUG_PREFIX
  • HOMEBREW_EDITOR
  • HOMEBREW_KEEP_INFO
  • HOMEBREW_SVN
  • HOMEBREW_TEMP
  • HOMEBREW_USE_LLVM
  • HOMEBREW_VERBOSE

11 メモ

コマンドによってはシェルを開くため、cd しただけかと思いながら実は別シェルを開いているという罠がある。

12 参考

  • このエントリーをはてなブックマークに追加
エンジニア募集中です!