MacでHomebrewを使ったパッケージ管理覚書

はじめに

結城智久(@TomohisaYuuki)です。
Macで開発環境を構築しようとして調べていると、homebrewを使ってインストールするのがデファクトスタンダードなように見受けられます。
ですが、どうしてHomebrewを使うのか?パッケージ管理システムってどういうものなのか?正直よく分かっていませんでした。
この記事ではパッケージ管理システムについて基本的な事柄を整理し、Homebrewの使い方をまとめます。

パッケージ管理とは

配布形式との関係

パッケージの配布には大きく分けて以下の2つの配布形式があります。

1. バイナリ形式
コンパイル済みのファイルを配布する。

  • 配布者:様々な環境に合わせたファイルの作成・動作確認を行う必要があり、膨大な労力がかかる。
  • 利用者:配布されたファイルをインストールするのみ。知識や技術が不要で労力もかからない。

2. ソースコード形式
コンパイルソースコードを配布する。

上記の通り、配布形式がバイナリ形式の場合はあまり問題はありませんが、ソースコード形式の場合は利用者がある程度自分で作業しなくてはなりません。これらの形式を自動で判別し、必要であればコンパイル・ビルドを自動で行ってくれる仕組みがパッケージ管理システムの機能の一つです。

インストール時の問題解決

ソフトウェアをインストールするとき、以下の事象が発生することがあります。

  1. ソフトウェアAを利用するにはソフトウェアBが必要(ソフトウェアの依存関係)
  2. ソフトウェアCによってインストールされるファイルDが、すでにソフトウェアEによってインストールされている(ソフトウェアの競合関係)

少数のソフトウェアであれば一つ一つ対処すればいいですが、多くのソフトウェアの依存・競合関係を手動で管理するのはかなりの手間がかかります。
これらを自動で管理する仕組みがパッケージ管理の機能の一つです。


まとめるとパッケージ管理とは、ソフトウェアのインストール・アンインストール・更新やこれらに伴う煩雑なソフトウェアの管理作業のことで、このような仕組みを提供しているツールをパッケージ管理システムと言います。

パッケージ管理の仕組み

とてもざっくりした説明

そもそもパッケージとは以下をひとまとめにしたファイルです。

  • アプリケーションの実行プログラム/ソースの本体orURL
  • 設定ファイル
  • 共有ライブラリ
  • ソフトウェアを構築するのに必要な開発用ファイル
  • ドキュメント
  • メタデータ

パッケージに含まれるメタデータの中には以下が含まれています。

  • 概要
  • 説明文
  • パッケージに含まれているファイルの一覧
  • ソフトウェアのバージョン情報等
  • 構築日時と場所、および構築者に関する情報
  • 対応するアーキテクチャ
  • パッケージに含まれるファイルのチェックサム
  • 含まれるソフトウェアのライセンス情報
  • 正しく動作するのに必要なほかのパッケージに関する情報 等

これらの情報をもとにソースコードからのコンパイル・ビルドや依存関係・競合関係の解消を行っているというわけです。

Homebrewの仕組み

インストールの仕組み

以下のサイトの「仕組み」の項で[brew install」を行ったときの処理の流れが解説されています。
blog.mothule.com

各種用語と詳しい仕組み

パッケージの取得先や配置先、各種用語や詳しい仕組みは以下のサイトがとてもわかり易かったです。
blog.ottijp.com

Macにおけるパッケージ管理システム

Macのパッケージ管理システムとして有名なものにHomebrewとMacportsがあります。
いろいろな方が言っている両者の違いについての情報をまとめたのが以下の表です。

比較項目 Homebrew Macports
配布形式 ソースコード バイナリ(バイナリが無い場合はソースコードをビルド)
既存のソフトウェアの利用 なるべく既存を利用 新たにインストール
インストールにかかる時間
システムへの最適化度合い
公式リポジトリのパッケージ数
インストール可能なユーザ 一般ユーザ スーパーユーザ(管理者権限sudoが必要)
パッケージのインストール先 /usr/local /opt/local
コンパイラ clang clang

インストールの所要時間の比較

MacPortsはビルド済みのバイナリファイルを配布するため個々のパッケージのインストール所要時間は短く済むのですが、Macに導入済みのソフトウェアを無視して対象パッケージが依存するソフトウェアを新規インストールします。
一方Homebrewはソースコードからのビルドが基本なので個々のパッケージのインストール所要時間は長くなりますが、極力Macに導入済みのソフトウェアを利用する作りです。
そのため、総合的にはHomebrewのほうがパッケージのインストール所要時間が短く済む傾向にあるようです。またビルドを行うことで自分の環境に最適化されるメリットもあります。

扱えるパッケージ数の比較

扱えるパッケージ数はMacportsに比べてHomebrewは少ないようです。しかし、これはMacportsとHomebrewの公式リポジトリを比較した場合。
Homebrewのリポジトリは公式のGithubリポジトリだけでなく、ユーザーが自分のGithubリポジトリをシェアする仕組みになっています。
つまり、gitコマンドがアクセスできるところならどこでもリポジトリとして扱えます。
また、GUIアプリの管理ができる拡張機能Homebrew-caskもあり、公式リポジトリしか存在しないMacportsより広い範囲のパッケージを管理することができます。


上記のメリットから、MacportsよりもHomebrewが選ばれているようです。

Homebrewの使い方

HomebrewとHomebrew-cask

Homebrewと似た名前のHomebrew-caskなるものがあるのですが、それぞれの特徴を以下に示します。

Homebrew

  • 公式説明:「アップルが提供していないあなたの必要なものをインストールできます」
  • つまり:CUIアプリ(開発ツールなど)をコマンドライン操作でインストール可能にする。

Homebrew-cask

インストール方法

Homebrewのインストール
brew.sh

  1. 公式サイトのトップに貼ってあるスクリプトをコピー
  2. Macでターミナルを起動
  3. ターミナルにスクリプトをペーストして実行


Homebrew-caskのインストール
Homebrew-caskはHomebrewに含まれるため、インストール作業は不要です。

基本的なコマンド

分類 処理 Homebrewコマンド Homebrew-caskコマンド
パッケージの操作 パッケージを探す brew search [検索ワード] brew search —cask [検索ワード]
パッケージをインストール brew install [パッケージ名] brew cask install [パッケージ名]
パッケージをアンインストール brew uninstall [パッケージ名] brew cask uninstall [パッケージ名]
Homebrewでインストール済みのファイルを表示 brew list brew list —cask
インストール済みパッケージのサマリーを表示 brew info [パッケージ名] brew cask info [パッケージ名]
パッケージを有効化 brew link [パッケージ名] -
パッケージを無効化 brew unlink [パッケージ名] -
更新のあるパッケージを確認 brew outdated brew outdated —cask
更新があるパッケージを再ビルド brew upgrade [パッケージ名] brew upgrade —cask [パッケージ名]
Homebrew本体の操作 バージョン確認 brew -v -
Homebrewの更新 brew update brew update —cask
設定を見る brew —config -
問題がないかチェック brew doctor brew doctor --verbose
コマンドのヘルプを表示 brew help [コマンド名] brew cask help [コマンド名]

おわりに

パッケージ管理とHomebrewについてだいぶ理解が深まりました。
パッケージ管理に限りませんが、指示されたとおりにコマンドを叩くだけで便利な機能を使うことができてしまいます。
その背後でどのような仕組みで動作しているのか、コマンド一つ一つの意味や類似ソフトウェアに対する優位性もちゃんと理解しながら使っていくようにしたいものです。