macOS 作为一个类 Unix 系统,却缺乏类似 Debian 的 APT、Fedora 的 DNF 这样的软件包管理系统(package-management system),或者说包管理器(package manager),这对很多将 macOS 系统作为软件开发环境的用户来说无疑是件麻烦事。好在还有 MacPorts、HomeBrew、Fink 等第三方包管理器填补这一空白。不过包管理器的选择众多,各有优缺点,我们该如何选择最适合自己的一款呢?
对 macOS 系统来说,好用的包管理器必须具备两个重要因素,即其自身的易用性和所能提供的软件库数量。鉴于此,能满足这两个条件也最常见的两个选择就只剩下 MacPorts 和 Homebrew 了。
下面我们就从各方面对比一下这两款较为常用的包管理器。
起源
MacPorts 项目始于 2002 年,最初被命名为 DarwinPorts,是苹果公司 OpenDarwin 项目的一部分。四年后苹果公司关停了 OpenDarwin 项目,MacPorts 也自此成为独立于苹果公司的开源项目。其名称中的 Mac 和 Port 明确表明了为 macOS 系统移植软件的目的。
Homebrew 项目始于 2009 年,原作者是 Max Howell,最初在 Ruby on Rails 社区开始流行,因其可扩展性和易用性而获得赞誉。其名称“家酿酒”暗示了按照用户的偏好构建适配 macOS 系统的软件。
MacPorts 和 Hombrew 的目的都是简化 macOS 系统上的软件安装,包括安装 macOS 系统上预装软件(如 Python)的最新版本。
实现
MacPorts 是用 Tcl 和 C 语言编写的,它将所管理的软件称为 port(意为适配 macOS 的移植软件),构建 port 的指令存放在由 Tcl 语言编写的 portfile 文件中,这些 portfile 由不同的维护者负责。
通常构建软件阶段不会发生在用户的电脑上,原因是 MacPorts 为不同的 macOS 系统版本和处理器架构分别提供了预先构建的二进制文件,以大幅提升软件的安装速度。只有遇到软件许可证不允许分发二进制文件等情况,MacPorts 才会在用户电脑上通过源码构建软件。
MacPorts 默认将所有数据存放在 macOS 系统的以下目录中。
/opt/local
MacPorts 遵守此目录的默认权限,因此通过 MacPorts 安装软件时,需要在安装命令前添加 sudo
命令以获取系统管理员权限。
另外,除非用户主动开启,MacPorts 默认不会收集任何用户数据。
Homebrew 主要用 Ruby 语言编写,它将其所管理的软件称为 bottle(寓意按照用户的喜好所构建的软件),构建 bottle 的指令存放在被称为 formulae 的 Ruby 脚本中,这些脚本由不同的维护者负责。
与 MacPorts 相似,Homebrew 通常也不需要在用户的电脑上构建软件,会直接将相应的二进制文件安装到你的 macOS 系统中。但是对于 Homebrew 不再支持的 macOS 系统版本,则只能在用户的电脑上通过源代码构建软件。Homebrew 通常仅支持最近两三个 macOS 系统版本,关于这个问题还会在下文中的“兼容”这一小节详细说明。
Homebrew 依据不同的芯片,分别默认将数据存放下面的目录中。
对于基于 Intel 芯片的 macOS 系统,数据存放在以下目录。
/usr/local
对于基于 Apple 芯片的 macOS 系统,数据则存放以下目录。
/opt/homebrew
Homebrew 不遵守此目录的默认权限,安装时会将其所有权从默认的管理员更改为当前用户,因此不需要像 MacPorts 那样每次安装软件时都需要赋予管理员权限,但这也是常被人诟病的安全瑕疵。
另外,Homebrew 默认会收集用户的软件安装、软件构建错误、操作系统版本等信息,不过用户可以通过以下命令手动关闭这些收集。
brew analytics off
MacPorts 和 Homebrew 虽然在采用的语言、安装软件的位置、数据收集策略这几点上都有所差别。但从用户角度看很难说有太大差异。
兼容
对于包管理器来说,除了易用性和软件库数量,还有一个不可忽视的因素,那就是对 macOS 系统版本的兼容性,当你无法保证你使用的 macOS 系统是较新的版本时,这一因素的影响就显得尤为突出。
MacPorts 除了支持最新版本的 macOS 系统外,可向前兼容至 Mac OS X 10.5(Leopard),因此,哪怕你的 Mac 电脑是十年前购买的,已经无法法升级到最新的 macOS 版本,都以可放心使用。
Homebrew 仅支持 macOS 的最近两三个版本,如果你的 macOS 版本较低,则只能通过在本地构建的方式安装软件,同时 Homebrew 会提示你需要自行处理构建软件时所出现的所有问题,而通常这种方式并不理想,最终你只能选择放弃使用 Homebrew 以及停止更新软件。
因此,从兼容方面讲,MacPorts 和 Homebrew 存在着较大的差异。如果你会频繁升级 Mac 电脑,保持 macOS 系统不低于最近两三个版本,则任选其一没什么问题,否则 MacPorts 则是更理想的选择。
安装
MacPorts 和 Homebrew 都依赖苹果的“命令行开发工具”(Command Line Developer Tools),因此,如果你的 macOS 系统还未安装此工具,需要在安装这两款包管理器之前,运行以下命令完成安装。
xcode-select --install
注意,如果提示需要最新版本“命令行开发工具”,需要先运行以下命令将其删除之前安装过旧版本,再运行上面的命令进行安装。
sudo rm -rf /Library/Developer/CommandLineTools
如果运行此命令时出错,可以访问该工具的下载页面,登录 Apple 账号后,下载适合你的 macOS 系统版本的安装程序进行安装。你可以访问该工具的发布说明来确定你的 macOS 系统应该安装哪个版本。
安装 MacPorts
MacPorts 为不同的 macOS 系统版本分别提供了简易安装程序,只需要访问以下链接,选择下载匹配 macOS 系统版本的安装程序进行安装即可。如果你想尝试其他安装方式,也可参考官方安装指南。
下载链接:https://github.com/macports/macports-base/releases
安装完成后,在终端上运行以下命令确认 MacPorts 是否安装成功。
port version
如果运行命令后正常显示 MacPorts 的版本号即表示安装成功。
安装 Homebrew
Homebrew 依赖 Ruby,不过通常无需额外安装 Ruby,因为 macOS 系统预装的 Ruby 即可满足其安装条件。不过由于 Homebrew 支持的 macOS 系统版本有限,建议安装前先参考官方的具体系统要求。
Homebrew 现在也提供了简易的安装程序,只需要访问以下链接下载最新版本即可。当然你也可以参考官方安装指南终端通过命令安装。
下载链接:https://github.com/Homebrew/brew/releases/latest
安装完成后,在终端上运行以下命令确认 Homebrew 是否安装成功。
brew --version
如果运行命令后正常显示 Homebrew 的版本号即表示安装成功。
使用
MacPorts 和 Homebrew 都提供了一套便于用户使用的命令。
MacPorts 可以通过命令 port help
或阅读官方在线版用户手册查看相关命令使用方法。Homebrew 可通过命令 brew -h
或阅读官方在线版用户手册查看相关命令使用方法。下面简要介绍一下常用命令。
使用 MacPorts
如果你不确定 MacPorts 是否有你想要安装的程序,可以先运行搜索命令进行查找。比如安装 Python,可运行如下所示命令查找。
注意,由于 MacPorts 的搜索结果会显示程序的名称和简介,如果你想要更整洁点的结果列表,可使用 grep
程序使其仅显示程序名称。
port search python3 | grep python3
找到要安装的程序后就可以运行如下命令进行安装了。注意,如果程序存在多个版本,需要指定你所要安装的版本。这里和 Homebrew 不同,如果不指定版本号 MacPorts 可能不会安装最新版本。
sudo port install python312
MacPort 支持安装多个版本,并自动将同一程序的不同版本进行分组,你可以通过运行以下命令查看所有可用的程序分组。
port select --summary
假设你同时安装了 Python 2.7 和 Python 3.12,并且想要将 3.12 版本设为运行 python
命令时的默认版本,则可以运行如果下所命令。
sudo port select --set python python312
要卸载一个程序,比如刚安装的 Python,可运行如下所示命令。
sudo port uninstall python312
卸载程序后,如果担心其相关依赖没有被完全清除。要清理孤立的程序和不再被使用的文件,可运行以下命令。
sudo port reclaim
由于 MacPorts 正在持续更新中,因此会不断出现新版本,当你所安装的版本超过两周,通常会在运行 port 命令后看到更新提示,你只需要按照提示运行以下命令将 MacPorts 升级到最新版本即可。
sudo port selfupdate
你可以随时通过命令 port help
或阅读在线手册查看详细用法。
使用 Homebrew
Homebrew 的使用方式和 MacPorts 相似,如果你不确定 Homebrew 是否有你想要安装的程序,可以先运行搜索命令进行查找。比如安装 Python,可运行如下所示命令查找。
brew search python
找到要安装的程序后就可以运行如下命令进行安装了。
brew install python
注意,如果没有指定版本号,Homebrew 会安装最新版本,如果你需要安装特定版本,需要按照如下所示的方式指定版本号。
brew install python@27
卸载
卸载 MacPorts
MacPorts 官方提供了详细的卸载步骤。首先运行以下命令删除所有安装的 port。
sudo port -fp uninstall installed
然后删除用户和用户组。
sudo dscl . -delete /Users/macports
sudo dscl . -delete /Groups/macports
最后删除所有相关的文件即可。
sudo rm -rf \
/opt/local \
/Applications/DarwinPorts \
/Applications/MacPorts \
/Library/LaunchDaemons/org.macports.* \
/Library/Receipts/DarwinPorts.pkg \ /Library/Receipts/MacPorts.pkg \
/Library/StartupItems/DarwinPortsStartup \
/Library/Tcl/darwinports1.0 \
/Library/Tcl/macports1.0 \
~/.macports
卸载 Homebrew
Homebrew 官方提供了卸载脚本,只需要运行以下命令就可以按照提示一步步删除 Homebrew 及其数据。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
当然,如果你想要省掉步骤提示,可以运行以下命令,就可以静默自动删除了。
NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
发表回复