Aug 23

Homebrew 是一个由 Ruby 语言开发的 Mac OS X 上的第三方包管理工具,它使 Mac OS X 系统更加完整。Homebrew 能够判断 Mac OS X 系统中现有组件的状况,并能够依赖这些已有组件进行安装,而不必重新下载一套重复组件。这一点与 Mac OS X 上其他的第三方包管理工具不同。实际上,Mac OS X 上的第三方包管理工具有很多,例如 MacPortsFinkpkgsrcGentoo Prefix 等等。除 Homebrew 之外,这些第三方包管理工具均会把需要的所有组件全部安装到系统的某个目录(例如 /opt 目录),带来的问题就是 Mac OS X 系统很多已经有的组件都要重新下载安装,这除了带来系统臃肿不够整洁之外,还有可能带来冲突。Homebrew 本身使用 Git 管理,升级非常方便。它的项目主页在 http://brew.sh/

零、准备工作

Homebrew 的工作过程中需要使用编译器、Git 等工具,这些工具均由 Apple 官方的集成开发环境 Xcode.app 工具提供。它的安装方法有两种,一种是进入 Apple 的应用商店下载 Xcode;另一种是去 Apple 开发者主页 https://developer.apple.com/xcode 去下载 Xcode,不过开发者主页下载前一般需要先免费注册一下。下载安装完成后,执行下述命令

$ xcode-select --install

安装 Homebrew 真正需要的命令行工具。实际上,作为安装 Homebrew 的前提,仅需要下载 Xcode.app 的命令行工具,如果注册了 Apple 开发者的话,可直接到 https://developer.apple.com/downloads/ 页面下载它而不必安装完整的 Xcode.app 包。

一、Homebrew 的安装

Homebrew 默认会被安装在 /usr/local/ 目录。但是该目录非普通用户所有,相关操作需要管理员权限,普通用户需要 sudo 权限。若想免去 sudo 的麻烦,可更改目录的属主

$ sudo chown -R `whoami` /usr/local

这对于非服务器版本的 Mac OS X 系统的使用并无大碍。Homebrew 由 Ruby 语言开发,安装当然也只需要用 ruby 命令即可。先确认 Mac 系统上已经默认安装了 ruby:

$ ruby --version

安装 Homebrew 只需要如下的一条命令

$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

以上脚本执行完成后,Homebrew 会被安装在默认位置,可执行下述命令查看

$ brew --prefix
/usr/local

由于 /usr/local 已在系统 PATH 之中,Homebrew 已无须任何配置。

当然,Homebrew 也可被安装其他指定位置。为了更加清晰地了解安装过程,此地以家目录下的 Developer 目录为例:

$ mkdir ~/Developer/ && cd ~/Developer
$ git clone https://github.com/mxcl/homebrew.git

由于 Homebrew 没有装载默认位置,需要对它稍作配置。将 Homebrew 加入系统环境变量 PATH 中:

$ echo "export PATH=\$PATH:\$HOME/Developer/homebrew/bin" >> ~/.bashrc

环境变量的设置一般需退出并重新打开终端才能生效。为了立即生效,可执行下述命令

$ source ~/.bashrc

确认一下此种方式下面 Homebrew 的安装位置

$ brew --prefix

为了确认 Homebrew 运行时,对系统中各个目录时候有权限等问题,可执行下述命令诊断

$ brew doctor

二、Homebrew 的基本用法

在 Mac OS X 中没有提供想要的软件,可以使用 Homebrew 安装;这里以安装 wget 为例,先在 Homebrew 中查找有没有需要的软件(或者说 formula)

$ brew search wget

如果幸运的话,brew 包含了该软件的 formula,那么可执行

$ brew install wget

所有由 Homebrew 安装的包将被装入 `brew --prefix`/Cellar,然后通过软链接到 `brew --prefix` 目录中。例如

$ cd `brew --prefix`
$ find Cellar -iname 'wget'
Cellar/wget/1.15
Cellar/wget/1.15/bin/wget
Cellar/wget/1.15/share/man/man1/wget.1
$ ls -l bin/wget
bin/wget -> ../Cellar/wget/1.15/bin/wget

若想删掉由 homebrew 安装包,非常简单

$ brew uninstall wget

若不幸没有找到需要的 formula,可到邮件列表 homebrew@librelist.com 中反映,或者自己动手写一个 formula。创建 Homebrew formula 的典型方法如下:先用 Homebrew 下载源码包:

$ brew create http://foo.com/bar-1.0.tgz

该命令会创建原始的 formula,详见 `brew --prefix`/Library/Formula/bar.rb。接着编辑该 formula 让它工作,编辑的样例可在 Homebrew 系统中查找,例如

$ brew edit wget
Homebrew formulae are simple Ruby scripts:
require "formula"

class Wget < Formula
  homepage "http://www.gnu.org/software/wget/"
  url "http://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz"
  sha1 "f3c925f19dfe5ed386daae4f339175c108c50574"

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

不管怎么样,Homebrew 的开发是在 Ruby 与 git 下进行的,因此它的修改以及与上游更新合并均非常容易。

更新本地已安装的软件包

$ brew update
$ brew upgrade --all

清理残留的旧版本及相关日志

$ brew cleanup

三、Homebrew 的扩展源

当然,若 Homebrew 官方提供的包不能满足需要的话,那么还可以为 Homebrew 安装扩展源,甚至可以安装某个包的多个版本。例如,Mac OS X 已经自带了 PHP,若想安装其他版本的 PHP,可利用 josegonzalez 提供的 PHP 扩展,实际上若网络正常工作的话,下述命令会告知有哪些扩展源提供了 PHP:

$ brew search php

先增加扩展源

$ brew tap josegonzalez/php

现在可以安装需要的包了

$ brew install php55

删掉扩展源提供的安装包还是非常简单:

$ brew uninstall php55

删除 tap 仓库

$ brew untap josegonzalez/php

由于 Mac OS X 中的服务是由 launchctl 管理,对于习惯 Linux 的用户,不一定习惯这种服务管理方式。这就不得不提一下扩展源 gapple/services 提供的 Homebrew-services 了,它提供了类似管理 Linux 服务的命令。先安装扩展源

$ brew tap gapple/services

管理由 Homebrew 安装的服务,例如

$ brew install tomcat
$ brew services start catalina

打开浏览器查看 Tomcat 是否正常运行,注意到 Tomcat 的默认端口是 8080,因此

$ open http://127.0.0.1:8080 &

停止服务的方法也很简单

$ brew services stop catalina

若利用 Homebrew 安装了很多服务,想查看一下,也很简单,例如

$ brew install mysql nginx
$ brew services list

列出已安装的 tap 仓库

$ brew ls-taps

四、更多 Homebrew 指令

显示与 Homebrew 相关的系统信息

$ brew config

显示软件内容信息

$ brew info wxmac

根据列出的信息使用额外的编译选项安装 wxmac 包,例如

$ brew install wxmac --with-stl

对于已安装的包,也可重新选择编译选项安装

$ brew reinstall wxmac --with-static

Homebrew 可一次安装多个包

$ brew install w3m gnutls cscope

显示包依赖

$ brew deps w3m

用浏览器打开 Homebrew 的主页

$ brew home

用浏览器打开 w3m 的 formula 页面

$ brew home w3m

列出已安装的软件

$ brew list

查看已安装的无依赖包

$ brew leaves

查看 Homebrew 帮助

$ brew -h

若需要更多的帮助命令,可执行

$ brew commands

也可以查看 Homebrew 的手册页获得帮助

$ man brew

五、删除 Homebrew

万一用的不爽了,卸载 Homebrew 的方法也很简单

$ cd `brew –prefix`
$ rm -rf Cellar
$ brew prune
$ rm -rf Library .git .gitignore bin/brew *.md share/man/man1/brew.1
$ rm -rf ~/Library/Caches/Homebrew ~/Library/Logs/Homebrew /Library/Caches/Homebrew

此种卸载方式对于系统来说非常干净。

六、附录

Homebrew 也被移植到了 Linux 上,称为 Linuxbrew。虽然各种 Linux 发行都带有自己的包管理工具,诸如 apt-get、yum、pacman、emerge 等等,但对那些工作于服务器版本但没有管理员权限的 Linux 用户来说,Linuxbrew 仍有用武之地,可通过它无须管理员权限安装一些管理员没有提供的或者比系统中更新的包。它的项目主页:http://brew.sh/linuxbrew/

在安装 Linuxbrew 之前,需要先准备好依赖。例如在 Fedora 上,先执行如下命令

$ sudo yum groupinstall 'Development Tools'
$ sudo yum install curl git ruby bzip2-devel curl-devel expat-devel ncurses-devel zlib-devel

接着,将 Linuxbrew 从 GitHub 克隆下来:

$ mkdir ~/Developer/
$ git clone https://github.com/Homebrew/linuxbrew.git ~/Developer/linuxbrew

简单配置

$ echo "export PATH=\$HOME/Developer/linuxbrew/bin:\$PATH
      export C_INCLUDE_PATH=\$HOME/Developer/linuxbrew/include
      export LIBRARY_PATH=\$HOME/Developer/linuxbrew/lib" >> ~/.bashrc

然后执行:

$ source ~/.bashrc

这样子 Linuxbrew 就算装好了。