什么是MacPorts?
MacPorts是使用於Mac OS中第三方包管理工具。
MacPorts讓你可以輕松編譯、安裝和管理開源軟件。MacPorts可以分為兩個核心部分:MacPort base和MacPorts ports。
每個MacPorts port都是一個Portfile,在這個文件中定義了這是什么應用、它的特性,安裝它所需要的文件和指令。通過Portfile,你可以只執行一條命令就完成下載、編譯和安裝應用和庫文件。通過MacPorts管理開源軟件還有些其他的好處。例如:
1. 為指定的port自動安裝所有依賴包。
2. 為安裝的port提供卸載和升級功能。
3. 將所有port限制在一個沙盒內,這樣它就不會影響操作系統且不易崩潰。
4. 讓你可以為port預編譯二進制的安裝包,這樣你就可以在其他地方快速安裝該包而無需重新編譯它的源代碼。
MacPorts是在Mac OS X上開發的,但是它便於攜帶且可用於其他類Unix系統,尤其是BSD及其分支版本。
如何安裝MacPorts?
1. 首先安裝XCode。
XCode是由蘋果公司提供的開發包,它包含了編譯器、代碼庫和其他用於開發Mac OS X應用的工具。
你可以通過Mac App Store或Apple developer website下載XCode,你也可以在網上搜索相關資源。(點擊這里下載 XCode 5.1.dmg)
注意:請確保你的Mac OS X版本安裝了和它匹配的最新的XCode,使用過期版本會造成port安裝失敗。另外需要注意的是在OS 10.6之前,XCode不是通過Mac OS X的Software Update Utility進行升級,在Mac OS X 10.7之后,它通過Mac App Store升級。
2. 安裝MacPorts。
如果你使用的是Mac OS X,你最好使用Mac OS X Package Installer來安裝MacPorts,除非你不想將MacPorts安裝到它的默認目錄(/opt/local/)。
2.1. Mac OS X Package Installer
Mac OS X Package Installer能自動安裝MacPorts,設置shell environment,並且運行selfupdate命令來更新ports tree和MacPorts base。
你可以從MacPorts download directory下載最新的MacPorts Installer。以下直接給出幾個OS X版本用到的下載鏈接:
a. OS X 10.7 Lion: MacPorts-2.2.1-10.7-Lion.pkg
b. OS X 10.8 Mountain Lion: MacPorts-2.2.0-10.8-MountainLion.pkg
c. OS X 10.9 Mavericks: MacPorts-2.2.1-10.9-Mavericks.pkg
下載完成后,直接雙擊Package Installer執行默認安裝即可,安裝完畢后,打開一個新的終端,執行:
$ port version Version: 2.2.1
如果安裝成功,則可以看見版本號,如果出現 command not found,可以嘗試在這里(MacPorts and the Shell)查找原因。
3. 使用MacPorts。
MacPorts port 命令是與MacPorts交互的主要手段。它用於更新Portfiles、MacPorts基礎部件,安裝和管理ports。
3.1. help - 幫助命令。如果給出操作名稱,則顯示該操作的簡要說明,如果沒有給出操作名稱,則顯示port命令使用方法的基本說明。

$ port help port [-bcdfknopqRstuvy] [-D portdir] [-F cmdfile] action [privopts] [actionflags] [[portname|pseudo-portname|port-url] [@version] [+-variant]... [option=value]...]... Supported actions ------------------ activate, archive, archivefetch, build, cat, cd, checksum, clean, configure, contents, deactivate, dependents, deps, destroot, dir, distcheck, distfiles, dmg, dpkg, echo, edit, exit, extract, fetch, file, gohome, help, info, install, installed, lint, list, livecheck, load, location, log, logfile, mdmg, mirror, mpkg, notes, outdated, patch, pkg, platform, portpkg, provides, quit, rdependents, rdeps, rev-upgrade, rpm, search, select, selfupdate, setrequested, space, srpm, sync, test, unarchive, uninstall, unload, unsetrequested, upgrade, url, usage, variants, version, work Pseudo-portnames ---------------- Pseudo-portnames are words that may be used in place of a portname, and which expand to some set of ports. The common pseudo-portnames are: all, current, active, inactive, actinact, installed, uninstalled, outdated, obsolete, requested, unrequested and leaves. These pseudo-portnames expand to the set of ports named. Pseudo-portnames starting with variants:, variant:, description:, depends:, depends_lib:, depends_run:, depends_build:, depends_fetch:, depends_extract:, portdir:, homepage:, epoch:, platforms:, platform:, name:, long_description:, maintainers:, maintainer:, categories:, category:, version:, revision:, and license: each select a set of ports based on a regex search of metadata about the ports. In all such cases, a standard regex pattern following the colon will be used to select the set of ports to which the pseudo-portname expands. Pseudo-portnames starting with depof:, rdepof:, dependentof:, and rdependentof: select ports that are direct or recursive dependencies or dependents of the following portname, respectively. Portnames that contain standard glob characters will be expanded to the set of ports matching the glob pattern. Port expressions ---------------- Portnames, port glob patterns, and pseudo-portnames may be logically combined using expressions consisting of and, or, not, !, (, and ). For more information -------------------- See man pages: port(1), macports.conf(5), portfile(7), portgroup(7), porthier(7), portstyle(7). Also, see http://www.macports.org. xaviermavericks:~ Xavier$ port help selfupdate Usage: selfupdate --nosync Upgrade MacPorts itself and run the sync target
3.2. selfupdate - 該操作用於更新MacPorts,該操作應該經常執行,來將本地的ports tree和全球MacPorts ports倉庫同步以便你保持最新的port版本。同時它也會檢查MacPorts base,並及時更新它。
注意:selfupdate操作只適用於Mac OS X。如果你在其他平台運行MacPorts,你需要通過sync操作來更新ports tree,安裝最新的MarPorts來更新當前MarPorts base。
$ sudo port selfupdate - 更新當前ports tree和MacPorts base。
$ sudo port -d selfupdate - Debug模式更新,會顯示更新詳情。
3.3. sync - 同步ports tree,但不檢查MacPorts base。
3.4. list - 列出給定的ports的當前有效版本,如果未給定ports,則列出全部有效ports。因為全部的列表很長,如果你知道某個port名稱,最好使用search操作。
xaviermavericks:~ Xavier$ port list AppHack @1.1 aqua/AppHack ... xaviermavericks:~ Xavier$ port list zope-zsyncer zope-zsyncer @0.6.1 zope/zope-zsyncer
3.5. search - 該操作會搜索與給定名稱或描述相匹配的結果。
3.6. info - 獲取port詳細信息:描述,維護者等等。
3.7. deps - 顯示port的依賴包,這些依賴包需要在Portfile中明確列出才行。
xaviermavericks:~ Xavier$ port deps apache2 Full Name: apache2 @2.2.26_0+preforkmpm Library Dependencies: apr, apr-util, expat, openssl, pcre, perl5, zlib
3.8. variants - 該操作讓你可以在安裝port前檢查它的不同變體。Variants是port的作者提供一些參數,讓MacPorts在安裝過程中使用。
xaviermavericks:~ Xavier$ port variants nmap nmap has the variants: no_pcre: build without pcre support no_ssl: build without ssl support universal: Build for multiple architectures zenmap: build zenmap in addition to nmap
3.9. install - 安裝port,如果該port有variants,可以通過增加variants或者去除默認variants來進行安裝。
普通安裝 $ sudo port install nmap 添加variant安裝 $ sudo port install nmap +no_ssl 去除variant安裝 $ sudo port install fetchmail -ssl
3.10. clean - 清理操作,用於刪除MacPorts在build一個port時產生的臨時文件。它還經常用於fetch操作失敗后的清理崩潰了的文件。
sudo port clean --all vile
3.11. uninstall - 卸載操作,卸載port。
注意:要同時遞歸刪除port所依賴的開發包,使用--follow-dependencies標記。如果該開發包有其他開發包依賴於它,它將不會被刪除。
$ sudo port uninstall --follow-dependencies vile
要在刪除當前port前刪除所有依賴於它的開發包,使用--follow-dependents。
$ sudo port uninstall --follow-dependents ncurses
如果要刪除一個port,但這個port又是其他ports所依賴的對象,那么MacPorts不會刪除它,除非你先刪除那些依賴於此包的開發包。你可以使用-f參數來強制執行刪除。但謹慎使用,除非你真的很確定你在做什么。
3.12. contents - 內容操作,顯示某個port安裝過的文件。
3.13. installed - 列出已安裝port。顯示已安裝的版本、變體和激活狀態。使用 -v 參數顯示該port是在哪個平台哪個cpu結構下build的。
xaviermavericks:~ Xavier$ port -v installed python27 The following ports are currently installed: python27 @2.7.6_0 (active) platform='darwin 13' archs='x86_64'
3.14. outdated - 列出過期port。使用該操作前先selfupdate或者sync一下,以便對比當前已安裝port是否都是最新版本。
3.15. upgrade - 更新操作。當一個Portfile發生更新時,使用該命令來更新它對應的port及其依賴包。如果你只想更新port,不想更新它的依賴包,那么可以使用 -n 參數,但記住,這樣往往會有故障發生。
普通更新 $ sudo port upgrade gnome 只更新port,不更它的依賴包 $ sudo port -n upgrade gnome 更新所有過期port $ sudo port upgrade outdated
upgrade 默認更新行為是下載新的版本並啟用它,但不會刪除舊的版本。如果你要更新新版本同時卸載舊版本,使用 -u 參數。
$ sudo port -u upgrade vile
3.16. dependents - 列出所有依賴本包的開發包。
xaviermavericks:~ Xavier$ port dependents python27 nodejs depends on python27 py27-pip depends on python27 py27-setuptools depends on python27
3.17. livecheck - 檢查遠程倉庫該port是否有更新。
3.18. lint - 檢查Portfile是否符合規范。
xaviermavericks:~ Xavier$ port lint python27 ---> Verifying Portfile for python27 ---> 0 errors and 0 warnings found.
3.19. select - 在指定的分組,選擇一個默認版本並創建鏈接。例如,python 可能被鏈接到 python 2.6。可用的 select 分組被安裝在 ${prefix}/etc/select/ 的子目錄中,使用 --summary 參數列出所有分組。要列出分組中的可用版本,使用 --list。查看當前分組選擇的版本,使用 --show。要變更分組中選擇的版本使用 --set。
port select --summary port select --show python port select --list python port select --set python python34