虽然 Mac OS X 自带了不少 Unix 下的开源软件,比如 vim, ruby, python, perl 等等,也自带了许多常用的库,包括 iconv, zlib 等等,但我们仍然有时会需要自己动手安装一些这样的软件或者库,要自动化这样的安装,现有最常见的选择是 [MacPorts][macports] 和 [Fink][fink],其中 MacPorts 是基于源代码的包管理,并不在自己的库里储存软件的实际内容,只有一个定义如何编译代码的 [Portfile][portfile] 和一些专门针对这个平台的 patch;而 Fink 则是 [Apt][apt] 包管理系统在 Mac OS X 下的一个克隆,采用二进制分发,用户直接从 Fink 的仓库中下载安装软件。
[macports]: http://www.macports.org
[fink]: http://www.finkproject.org
[portfile]: http://guide.macports.org/chunked/development.html
[apt]: http://en.wikipedia.org/wiki/Advanced_Packaging_Tool
这两种方式各自有各自的优点和缺陷:
MacPorts 基于源代码的管理优点是非常灵活,更新很快 (很多时候更新只需要修改一下 Portfile 里的版本号和压缩包校验码就可以),用户要订制安装也可以简单的通过修改 Portfile 实现,而且很多开源软件的安装配置会有多种模式 (典型的大都通过 `configure` 步骤配置),在 MacPorts 中可以方便地通过 `variants` 参数指定,而不必像二进制分发那样,在远程服务器上编译的时候就定死了。而 MacPorts 的问题是,它希望自己安装的每套软件,所有的依赖都在它自己这个系统内 (一般就是你的 `/opt/local`) 解决,就算 Mac OS X 系统原生自带了满足依赖的库,它也坚决不用,这样就给你的系统增加了许多冗余,也客观增加了管理上的难度,典型的情况是:你的系统里装了两套 Python,该怎么管理外部安装的 Python 模块?比如通过 `easy_install` 或 `setup.py` 安装的,往往很难记住到底装到哪里了。
而 Fink 虽然不会这么自作主张地添加依赖,最大的问题是更新不够及时,这也是缺乏维护人手导致的。二进制安装的缺点在上面也提到了:不便定制。
所以 [Homebrew](http://github.com/mxcl/homebrew) 的出现,也许不是很及时,但在现在仍然是很必要的,它有这么一些优点:
1. 尽可能的利用你的系统里自带的库,包括 zlib, OpenSSL, Python 等等,只要 Mac OS X 自带了,它就不会另装一份。
2. 定制简单,通过用 Ruby 写的 Homebrew formula 来定制,甚至可以灵活的跟踪直接来自版本管理库的最新软件
3. 用 Git 管理和同步自身
4. 直接装在 `/usr/local` 下,这样可以少定义很多各种 `PATH` 环境变量
其中第一点尤为重要。好的,下面简单介绍一下 Homebrew 的安装,以及它是如何工作的。
#### 安装
首先,Homebrew 的原则是“No sudo”,也就是说,既然 Mac OS X (client 版本) 绝大部分情况下都是归你这个有管理员权限的用户,为什么在自己的 `/usr/local` 下安装程序还需要 `sudo` 呢?所以,首先:
sudo chown -R `whoami` /usr/local
然后可以正式开始安装,我推荐的安装方式是先用 [git-osx-installer](http://code.google.com/p/git-osx-installer/) 装上 git,然后用 git 安装:
cd /usr/local
git init
git remote add origin git://github.com/mxcl/homebrew.git
git pull origin master
这么做的实际作用是把你的 `/usr/local` 目录变成了一个本地 git 仓库,只不过这个仓库只跟踪跟 Homebrew 相关的更新,并不影响任何其他软件的安装。
这样安装会在 `/usr/local` 下创建 `Library` 这个目录,然后在 `/usr/local/bin` 中加入 `brew` 这个 ruby 脚本。
#### 使用
安装完毕,下面就可以试试了:
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](http://www.gobolinux.org/) 的软件管理方式。
安装后就可以用 `list` 命令列出:
$ brew list
pkg-config unrar
#### 更新
如果用了一段时间,需要更新同步上游的 Formula,可以简单地:
$ brew update
From git://github.com/mxcl/homebrew
* branch master -> FETCH_HEAD
Updated Homebrew from 60600885 to 60600885.
No formulae were updated.
Homebrew 会通过 git 完成同步。
总结起来,Homebrew 是一套很有新意的软件包管理工具,虽然它的更新及时程度还有待考验,但至少在目前还是比较令我满意的解决方案。
我觉得Mac OS X自带的UNIX软件很多都很旧,rsync竟然是2.6的。而且很多有用的功能都没有configure进去,比如说vim是没有clipboard和xclipboard的。感觉上在OS X上用UNIX工具没有在Linux下好用。当初说OS X是UNIX,实际上并不是百分百。
不过如果要在UNIX和Desktop App做一个平衡的话,Mac可能真是现在最好的选者。如果可以不通过expose,直接把一个窗口拖到旁边的space,如果有taskbar,…,若干个类似的如果之后,就是完美了。
啊,华哥好久不见…
rsync 我感觉影响不大… 不过自己装应该也没啥额外依赖。我个人觉得没有 wget 很不方便。
目前 vim 的 clipboard 支持是依赖图形界面的代码提供的,我写过一个 patch 可以让它在 console 下用的时候也能访问系统剪贴版,但一致没进入官方…
OS X下没有wget确实很难受。但若只为了安装一个wget用Macports的话有点杀鸡用牛刀的感觉,而且有点洁癖的人想必都不喜欢其乱装一堆依赖。因此从未在自己的Macbook上装过MacPorts/Fink。
曾试着了解过MacPorts,其实现在想来和Arch Linux中ABS/PKGBUILD的概念是异曲同工。也难怪,毕竟Arch Linux是inspired by BSD,号称最BSD like的Linux发行版之一(另外一个是老牌的Slackware)。
感谢jjgod推荐这个“家酿”,“佳酿”更好?受教了;-)
Homebrew的安装
1. curl -L http://github.com/mxcl/homebrew/tarball/master | tar xz –strip 1 -C /usr/local
2. export PATH=/usr/local/bin:$PATH
3. brew install git
4. cd /usr/local
5. git init
6. git remote add origin git://github.com/mxcl/homebrew.git
7. git pull origin master
这样就能使用brew安装维护的git而不用单独装一个git-osx-installer了。
MacPorts 重度依赖者飘过。。。
我觉得Ports还好吧, 反正都要装新版本, 索性就让它全部装上好了。OS X.6自带的东西也不是最新的了, 比如python是2.6.1,我在其他linux机器上都是2.6.4 + 3.1。 虽然只是细小的版本差距, 但是考虑到OS X上的一旦绑定就一直不会更新了, 还是用ports好。
p.s. 各位用wget都用来mirror么? 好像下载的话curl也可以凑合, 就是要手动 -o 或者 pipe
哈哈,很久没见,我是你的blog的忠实fans啊。 :)
有一段时间确实很依赖rsync ,但现在已经换到dropbox了。
你写了个vim的clipboard patch,太好了,哪里可以找到呢?谢谢啦!
虽然没有wget,但是也有较强功力的curl。
Patch 在这里: http://jjgod.org/code/vim/clipboard.patch 但可能要做一些修改才能应用于主干版本的 vim 上。
我一直用fink要是改成这个简单吗?
呵呵
不敢
直接修改 /usr/local 的 owner 不太合适,虽然 Mac 一般只有一个人使用,但是 sudo 的存在还是可以提高系统的安全性,避免一些不必要的误操作
port似乎有个python-select可以选择用哪个python,很方便。
port就是安装速度慢了点,硬盘占有不小,dependency的可视性不高,其他还不错。