Mac OS X 包管理安装工具Fink、macports 和 homebrew的介绍、比较和区别

如果你有Linux/Unix背景,那么在Mac上你一定想安装那些你熟悉的open source软件。为了将linux开源世界的各类软件移植到Mac下,出现了几个包管理器:Fink,Macports和Homebrew是3个主流的package management tool

1. Fink

Fink是基于Debian的packaging tools开发的。最大的特点是安装软件是预编译好的(pre-compiled/pre-built)。基于apt,二进制,我一开始用的。基于二进制的优点是安装很快,缺点是不方便定制,但这点我无所谓。我不能忍受的是里面软件的版本过于陈旧(比如现在ffmpeg还是0.49,好像是2年前的版本),有时想要的软件没有也挺郁闷的;fink东西不如macports多。顺便说一句最近更新似乎加快了。

所以,用Fink安装package是不需要在本机编译的,都是现成的binary code。

Fink最大的问题是package跟进不够快。很多最新版的软件,你要等Fink。

2. Macports

Mac算是BSD的一个变种吧。所以,BSD的包管理软件port被移植到Mac上就显的理所当然了。非常活跃,从源代码编译,可以用variants灵活定制。我一直在用,原因是东西全,更新快。但是最近觉得难以忍受了,因为缺点也很明显:每次更新之后的编译都要花很长时间,有的包(比如mplayer)还会在某次更新被破坏。除此之外也有必须在/opt下安装自己的依赖库的缺点,浪费硬盘空间(这点我倒是还可以忍受,不过装过GNOME会崩溃的,我就因为错装了GNOME重装过系统)。

macports的工作方式是下载source code然后在本地编译。macport的理念是尽量减少对系统现有库的依赖。所以,第一次用macport的时候,需要很长时间让macport重新build整个基本库,什么perl啊,python啊的。

代价是较长的编译时间,较多的依赖关系下载。好处是不怎么依赖系统,也就是说,更新Mac OS不会破坏你现有的package。另外,macports安装所有的package到/opt/local下面。这样不会和系统现有的/usr/local有什么冲突。

3. Homebrew

这个比较新,是在Lion之后才兴起的。Homebrew 是一个全新的程序包管理器, 用 Ruby 开发而成, 轻巧, 智能. 它能自动判断当前机器的程序包的状况, 自动和系统中已经有的程序包整合在一起。

工作方式和macport类似,也是下载source并在本地编译安装。但是和macports有两个根本的区别。

1) homebrew的理念是尽量使用系统现有的库。这样可以大大的减少编译时间。

2) package都安装到/usr/local下面。

这两点和macports是完全相反的。结果也是有利有弊。最大的好处莫过于编译时间变短,安装简单。问题就是和系统紧密依赖。

另外Homebrew假设你的Mac是单用户系统,所以/usr/local的owner应该是你,而不是传统的root。这个假设在大多数情况下都成立。(当然你可以改变homebrew的安装路径,然后修改你的PATH)

所以 Homebrew 的出现,也许不是很及时,但在现在仍然是很必要的,它有这么一些优点:

尽可能的利用你的系统里自带的库,包括 zlib, OpenSSL, Python 等等,只要 Mac OS X 自带了,它就不会另装一份。

定制简单,通过用 Ruby 写的 Homebrew formula 来定制,甚至可以灵活的跟踪直接来自版本管理库的最新软件。

用 Git 管理和同步自身,直接装在 /usr/local 下,这样可以少定义很多各种 PATH 环境变量。

其中第一点尤为重要。好的,下面简单介绍一下 Homebrew 的安装,以及它是如何工作的。
Homebrew 是用 Ruby 开发的, 这意味着, 你需要有一个 Ruby 解析器, 好在 Mac 默认已经自带了.

Hackintosh:~ liang$ ruby -e “$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)”

接下来就是全自动安装, 安装时间根据网络速度而定, 我去泡杯咖啡先….

==> Downloading and Installing Homebrew…
==> Installation successful!

搞定! 试一下:

Hackintosh:~ liang$ brew -v
0.6
Hackintosh:~ liang$ brew install wget
==> Downloading http://ftp.gnu.org/gnu/wget/wget-1.12.tar.bz2
######################################################## 100.0%
==> ./configure –disable-debug –prefix=/usr/local/Cellar/wget/1.12 –disable-iri
==> make install /usr/local/Cellar/wget/1.12: 7 files, 540K, built in 47 seconds
Hackintosh:~ liang$ which wget
/usr/local/bin/wget

使用:安装完毕,下面就可以试试了:

brew search

这个命令用来搜索所有可以通过 homebrew 安装的软件,不带任何参数的时候就是列出所有的。可以看到数量已经不少了。

下面就是选择安装,比如我想安装 unrar:

$ brew search rar
gnu-scientific-library unrar

$ brew install unrar
Warning: It appears you have Macports or Fink installed
Although, unlikely, this can break builds or cause obscure runtime issues.
If you experience problems try uninstalling these tools.
/usr/local/Library/Formula/unrar.rb:3: warning: already initialized constant ALL_CPP
==> Downloading http://www.rarlab.com/rar/unrarsrc-3.9.4.tar.gz
######################################################################## 100.0%
==> g++ -O4 -march=core2 -mmmx -msse3 -w -pipe -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE all.cpp -o unrar
/usr/local/Cellar/unrar/3.9.4: 3 files, 320K, built in 13 seconds

可以看到,unrar 被安装到了 /usr/local/Cellar/unrar/3.9.4 这个目录下,但这样我们访问起来显然很不方便,所以 Homebrew 会在 /usr/local/bin 下面创建到unrar 程序的符号链接,如果安装的是库之类的,也会对应在 /usr/local/lib 这样的目录下创建符号链接。所以这是一套类似GoboLinux 的软件管理方式。

安装后就可以用 list 命令列出:

$ brew list
pkg-config unrar

另外,一个不太重要的区别,macport是用rsync来同步repository tree和获取新的package的。homebrew是用git来管理repository的。如果你是在内部网或者firewall后通过proxy使用,这点可能会给你带来影响–一些proxy不支持rsync的。

总结:

1. 忘了Fink吧,老了。

2. 如果你是重量级的Linux用户,希望使用所有的open source package,那么macports是你不二的选择。

3. 如果你只希望很快的安装一些便利的工具,那么homebrew是个不错的选择。

Top Down