MacOS软件包管理器--MacPorts
摘要
- MacPorts 是 macOS 上的软件包管理器,用来安装命令行工具和库,例如
git、wget、nginx。角色和 MacOS软件包管理器--brew 相同,默认目录是/opt/local,可以和 Homebrew 装在同一台机器上。 - 安装脚本叫 Portfile,对应 Homebrew 的 formula。日常命令是
port,改动系统的操作要加sudo。 - Homebrew 计划在 2027 年 9 月或更晚停止在 Intel Mac 上运行,官方建议改用 MacPorts。已经用
brew装好的软件不会自动搬过来,要在 MacPorts 里重新装。 - 本文命令对照 MacPorts Guide,安装包版本以指南页上的 2.12.6 为例。本机是 MacOS Intel Sequoia 15.7.9,安装包选带
15-Sequoia的 pkg。
安装
-
需要 Xcode Command Line Tools。系统里已经为 Homebrew 装过的话,不用再装一遍。
1 | xcode-select --version |
用 pkg 安装
-
官方推荐用和当前 macOS 版本对应的 pkg,不要用源码安装,除非你不想装到
/opt/local。下载页:GitHub releases,各系统的直链写在 Install MacPorts。 -
Sequoia 15 对应
MacPorts-2.12.6-15-Sequoia.pkg。pkg 按 macOS 大版本区分,15.7.8 升到 15.7.9 不用换包。一个系统版本一个包,Intel 和 Apple Silicon 用同一个 pkg。双击安装即可。安装程序会自己改 shell 配置,并把 ports 树更新到最新。 -
新开一个终端再验证:
1 | $ port version |
-
安装程序会把下面这行写进
~/.zprofile或~/.profile,让 MacPorts 的命令排在 PATH 前面:
1 | export PATH=/opt/local/bin:/opt/local/sbin:$PATH |
-
提示
command not found时,先新开终端。仍没有,就检查上面的 PATH 是否写进了当前 shell 会读的文件。说明见指南 MacPorts and the Shell。
升级 macOS 之后
-
同一个大版本里的小更新,例如 Sequoia 15.7 升到 15.7.9,原来的安装继续用。更新 MacPorts 和已装软件:
1 | sudo port selfupdate |
-
跨大版本,例如 Sequoia 15 升到 Tahoe 26,已装的 port 是按旧系统编译的,只跑
selfupdate不够。MacPorts 2.10.0 起用port migrate,它会按当前系统重装 MacPorts 本体,并重装和当前系统不兼容的 port。步骤见 Migration。
1 | # 1. 先把 Xcode Command Line Tools 更新到新系统对应的版本 |
-
迁移前会给已安装的包做快照。有的包装失败时,等上游修好后再执行
sudo port restore --last。快照不再需要时,用port snapshot --list看编号,再sudo port snapshot --delete <编号>删掉。 -
2.10.0 之前没有
port migrate。那种情况要先装上当前系统对应的 pkg(已安装的 port 还在),再执行上面的sudo port migrate。
目录
1 | /opt/local # 安装前缀,对应 brew --prefix |
-
通过 MacPorts 安装的软件在
/opt/local下面,不在 Homebrew 的/usr/local/Cellar或/opt/homebrew/Cellar。
卸载
-
先卸掉所有 port,再删掉 MacPorts 本体。配置和数据库在
/opt/local/etc,需要保留就先挪走。完整步骤见 Uninstall MacPorts。
1 | sudo port -fp uninstall installed |
-
Catalina 及更新的系统开着 SIP 时,要先删
macports用户,再删/opt/local。
常用命令
-
查帮助:
port help,某个动作再加名字,例如port help install。完整列表在man 1 port,在线版是 Using MacPorts。 -
和 Homebrew 的对应关系:
| 要做的事 | Homebrew | MacPorts |
|---|---|---|
| 更新软件列表和工具本身 | brew update |
sudo port selfupdate |
| 搜索 | brew search wget |
port search wget |
| 查看信息 | brew info wget |
port info wget |
| 安装 | brew install wget |
sudo port install wget |
| 已安装 | brew list |
port installed |
| 可升级 | brew outdated |
port outdated |
| 升级 | brew upgrade |
sudo port upgrade outdated |
| 卸载 | brew uninstall wget |
sudo port uninstall wget |
| 依赖 | brew deps wget |
port deps wget |
| 谁依赖它 | brew uses wget |
port dependents wget |
| 不再被需要的依赖 | brew autoremove |
sudo port uninstall leaves |
| 后台服务 | brew services start nginx |
sudo port load nginx |
| 检查环境 | brew doctor |
port diagnose |
更新、搜索、安装
1 | sudo port selfupdate # 更新 MacPorts 本体和 ports 树。装新软件前先跑一次 |
-
port list会把索引里所有包都打出来,又长又慢。查已安装的包用port installed,查某个软件用port search。 -
有预编译包、并且许可证允许再分发时,
port install会从packages.macports.org下载,跳过编译。没有二进制包就在本机从源码编译。编译失败时先清理再重试,日志路径会打在终端里:
1 | sudo port clean wget |
已安装的包、卸载、清理
1 | port installed # 列出已安装的包。active 是当前在用的版本 |
-
upgrade不会马上删旧版本,只是把它标成 inactive,出问题还可以切回去。确认新版本可用之后,再用sudo port uninstall inactive收回空间。
依赖
1 | port deps wget |
服务
-
带后台进程的 port,用
load/unload交给 launchd。对应 Homebrew 的brew services。
1 | sudo port load nginx |
和 Homebrew 装在一起
-
两个前缀不同,文件不会写进对方的目录。安装程序把
/opt/local/bin放在 PATH 最前面之后,同名命令会先用到 MacPorts 的那一份。用which git确认当前是哪一个。 -
同一个软件不要两套一起用。编译 MacPorts 的包时如果报和
/usr/local里的库冲突,安装命令加上-t。 -
gem只安装 Ruby 的库,不能用来装git、wget、nginx这种通用软件,也不能代替 MacPorts。
国内镜像
-
软件列表来自
sources.conf里带[default]的那一行,默认是:
1 | rsync://rsync.macports.org/macports/release/tarballs/ports.tar [default] |
-
北京镜像由清华大学维护,主机名是
pek.cn.rsync.macports.org。编辑/opt/local/etc/macports/sources.conf,把上面那一行换成:
1 | rsync://pek.cn.rsync.macports.org/macports/release/tarballs/ports.tar [default] |
-
改完执行
sudo port -v selfupdate。其它地区的镜像列表在 Mirrors。 -
2.10.0 起,MacPorts 本体的更新默认走 HTTP。
macports.conf里的rsync_server、rsync_dir只在 HTTP 失败、退回 rsync 时才用到。ports 树仍然看sources.conf。