#osxchat blog

2005/03/06

DarwinPorts 介紹:以升級安裝 vim 為例

作者: lukhnos

今天要介紹 DarwinPorts 這個強大的東西。為什麼說是「東西」呢?因為 DarwinPorts 這個詞彙同時具有多種意義,它同時是一個軟體計劃、一套軟體安裝管理工具,同時背後又代表了超過兩千套以上的軟體集。

對於有其他 *nix 經驗的使用者,尤其是用過 FreeBSD 的朋友,對於 "port system" 或套件管理 (package management) 的概念一定不陌生。不過我還是先說明一下,為什麼我們會需要 DarwinPorts 這類型的系統。簡單地說,port system 是為了解決軟體安裝和管理的問題而生的工具,而這其實是 *nix/open source 文化的產物,同時也成為了維繫 *nix/open source 文化不可或缺的一環。

為什麼會需要 port system

下面我舉個簡單的例子,說明為什麼會需要 port system 這樣的東西。

就做為一套 *nix 系的作業系統來說,OS X 算是包裝得相當體貼的,大多數的工具都有相當不錯的預設值,可以直接使用。如果再安裝完 Xcode ,那麼 OS X 就變成了相當完整的開發環境。包括 Apache, PHP4, Perl 等常用的網站開發工具也都擺在那邊等候啟用了(只要更改 /etc/httpd/httpd.conf 裡把 mod_perl 及 mod_php4 打開就行)。

但是使用 Apple 包裝好的軟體,遲早都會遇到一個問題:軟體版本開始老化,需要升級了。

Apple 的線上軟體自動更新,主要是 OS X 作業系統本身的升級,以及系統安全修補,偶爾則會發佈諸如 iTunes 或 Keynotes 一類自家軟體的更新。對於 OS X 所附的 *nix 工具,則沒有這樣的服務。當然,這個問題涉及的層面太廣,Apple 要真是提供這樣的更新,所製造的問題,說不定會比解決的問題多。至於是否真是如此,這已經觸及一個 *nix 世界的重大議題,遠遠超出本文所能討論的範圍,可能要另外專文討論了。

總而言之,既然 Apple 不提供 *nix 工具的更新,使用者就得自己來。

好比說,我們要更新系統提供的 vi (其實是 vim )好了。為什麼我們需要更新呢?因為 Apple 所附的 vim 是 6.2 版的,目前已經出到 6.3.x 了。另一個問題是 Apple 當初在包裝 OS X 的時候,所建造的 vim 並沒有完整的亞洲字元支援;簡言之,就是沒有支援 UTF-8 或 Big5 內碼的能力。

那麼就說我們要更新 vim 好了。傳統上,我們有兩種選擇:一種是安裝 vim 作者提供的 OS X 版本安裝包,另一種則是下載 vim 的原始碼(我還是不習慣「源碼」這個說法)自己編。

OS X 自家提供的軟體方式,最有名的,就是「抓下來後,直接拉進 Application 檔案夾」中這種最直觀的安裝法。這種安裝方法同時融合了 Apple OS X 之前的傳統,以及 NeXTSTEP 傳承來的 "bundle" 檔案結構,結果就是只要程式拉進 Application 檔案夾就可以用。另一種安裝方法則是所謂的「安裝套件」 (installation package) ,這種安裝套件就跟 Windows 上的 setup.exe 類似,只要跑完安裝過程,軟體就可以用了。這兩種 OS X 自家的安裝方式中,又以前一種「抓下來、拖進去,就可以開始用」最為先進,也一直是各家作業系統中的標竿:不管是 Windows 或其他 *nix ,都還沒有這麼直觀的軟體安裝/解除安裝方式。

但是,不管是上述哪一種方式,都還是有個最大的問題,或者說是前提:以我們想升級 vim 的例子來說,vim 的作者得幫我們準備好 Mac OS X 版的安裝套件才行。

有過軟體包裝經驗的朋友,大概都可以說上一長串軟體包裝是多麼痛苦的事。我知道有朋友甚至寧願只寫程式,也不願意做軟體發行(release,包括製作安裝套件、撰寫說明文件、提供軟體支援服務等)的工作。事實是,軟體包裝跟寫程式,往往是兩回事。以 OpenVanilla 為例,0.6.3 的包裝,遠遠落後程式碼約一到兩週。也就是說,當 OV 的作者群及先期使用者早就已經在使用 0.6.3 的最新程式碼時,大多數使用者還無法使用新版本,原因是安裝套件仍然只有 0.6.2 版的。OV 這種規模還算中小型的軟體都如此,一些大型的計劃就不用說了。

所以,除非該軟體專案特別強調安裝套件的製作,並且在其中投注極大的力氣,版本落後(version lag)的情況就一直是常態。

這種時候,抓原始碼回來自己編,就是另一種選擇了。

更認真地說,所謂 "open source" 這種概念,最迷人的地方,便是你不論如何,至少都可以抓原始碼回來自己編,自己把軟體組起來。

可是迷人的地方也有惱人的代價。編原始碼絕對是一件痛苦的。首先,大多數 open source 的程式,至少都有一兩打以上的可自訂組態 (configuration options) 可供選擇,這主要是因為 open source 的程式往往要滿足多種平台及功能上的需要。可自訂組態還不是最大的問題。如果作者夠貼心,那麼用預設值來編製程式,通常也是 ok 的。

最惱人的問題,在於「相依性」(dependency)。

軟體設計有一項鐵律,叫做「不要重新發明輪子」。已經有人做過的事情就不要再自己從頭做一次。因此絕大多數的軟體都至少會用到一兩套程式。以 PHP4 來說,這套語言工具至少需要 libiconv, expat, gettext, zlib, tiff 等五套程式庫或工具的配合。於是問題擴大了,我們得先取得這五套軟體,要不就是找已經有人包裝好的安裝套件,否則一樣得抓原始碼自己編。萬一運氣不好,這五套軟體還會依賴其他的程式庫,例如 tiff 這套程式庫就依賴 zlib 跟 jpeg ,那麼我們還沒去抓 jpeg 這套程式庫...... 如此延伸下去,做個幾輪,你又發現自己抓原始碼回來,實在太苦。

於是「套件管理」的概念誕生了。

該怎麼管理這些分散在各地、安裝選項各異、各有各自的相依套件的問題,其實是門大學問。不同的 *nix 系統因此發展出不同的管理哲學。RedHat 系的 Linux 發展出了 RPM ,Debian 有 apt-get ,至於 FreeBSD ,則是有 "port"。

用最簡單的說法,一套 "port" 其實就是一套軟體的「組建及安裝方法」,每一個 "port" 都是由一組檔案構成的,這些檔案告訴你,要去哪裡(或哪幾個可能的地方)抓取程式的原始碼,要怎麼把軟體編起來,然後之後又要把軟體裝到哪去。如果這套軟體依賴其他工具或程式庫,"port" 的管理系統會一路上溯,把每一套需要的程式都一一取得、編譯、組建起來。

(附帶提一個與 OS X 無關的話題:port 並不是 FreeBSD 唯一的軟體安裝方法。FreeBSD 也提供了所謂的 package installation ,這裡的 package 是一套套預先編好,透過 sysinstall 或 pkg_add 這樣的工具便可以安裝完成的套件,最大的優點是節省大量的編譯時間,缺點...... 一樣是版本落後的問題。詳細的中文文件可參閱這裡,FreeBSD Handbook 英文版可參閱這裡)

DarwinPorts 就是供 OS X/OpenDarwin 這兩套作業系統所使用的 port system 。之所以取名為 "DarwinPorts" 也說明了它的概念是受到了 FreeBSD port system 的啟發。不過,DarwinPorts 並不是 OS X 上唯一的套件管理系統/工具/資源庫,另外一套同樣有名的 Fink ,提供了 Debian 系的 apt-get 工具。不過以下我們將專注於介紹 DarwinPorts ,簡稱 dports。

如何取得並安裝 DarwinPorts

對使用者來說,dports 是由兩個部份組成的:
  • port 工具
  • dports 的程式集,更正確地說叫 "port tree"
前面說過,一個 "port" 其實是一組描述檔,描述如何取得、編譯、安裝一套程式,並且告訴系統有哪些相依條件得先滿足。DarwinPorts 計劃收集了許許多多的 "port",於是便有了所謂的 "port tree",這其實便是一個相當龐大的軟體資料庫,裡面依軟體的功能或性質作分類,例如 Apache 便放在 www/apache 中,我們想升級安裝的 vim 就放在 editors/vim 裡面。

DarwinPorts 跟 FreeBSD 的 port system 不同的地方是,dports 提供了一個名叫 port 的工具,來幫助我們管理、安裝、解除安裝或升級各種 port tree 的程式。

以下我們便來實際安裝 dports。

首先,請先確定你是否已經安裝了最新版本的 Xcode 。目前可公開取得的 Xcode 版本為 1.5 。不管是 dports 還是 port tree 裡的軟體,都需要 Xcode 裡所附的 make, gcc 等工具,因此 Xcode 是絕對有必要的。(Apple 把安裝 Xcode 這件事弄得神秘難解,是一件很離奇的事,不過限於篇幅,我們就不多介紹 Xcode 的取得方法了)。

一旦有了 Xcode ,我們就可以取得 dports 了。取得方法也有兩種,一種是抓 DarwinPorts 網站上所提供的「每夜快照檔」(nightly snapshot),把抓回來的檔案直接解開。另一種則是使用 CVS 工具來取得檔案。我個人是建議使用後者,因為這樣可以快速更新所有的 port tree ──而且其實你完全不需要知道 CVS 怎麼用,只需要照著 DarwinPorts 網站上寫的步驟就行了。

由於我們會一直用到 port tree ,因此下載回來的檔案,我們要一直留著。

接下來,我們假設你要把 port tree 的檔案放在 /Users/Shared/darwinports 中,來安裝 dports 系統。

先開啟 Terminal.app 或其他終端機程式,然後:
cd /Users/Shared
cvs -d :pserver:anonymous@anoncvs.opendarwin.org:/Volumes/src/cvs/od login
cvs -d :pserver:anonymous@anoncvs.opendarwin.org:/Volumes/src/cvs/od co -P darwinports

以上 cvs 那兩行完全是從 DarwinPorts 網站上抄來的。當 cvs 問你密碼時,直接按 ENTER 就可以了。然後它就會在你的 /Users/Shared 裡建立一個名叫 /Users/Shared/darwinports 的目錄,並開始將 port tree 取回。

然後我們就得開始編譯並安裝 port 這套程式了:
cd /Users/Shared/darwinports/base
./configure
make
sudo make install
make clean
這樣我們就有 port 程式可以用了。

程式裝到哪去了?

但是,安裝完之後,你會發現,「我打 port ,什麼都沒有啊!」

這就要解釋 port 的安裝位置了。

如果你到目前為止用的都是以上的步驟,那麼你的硬碟裡,便會多出一個名叫 /opt 的目錄。而 port 這套程式就裝在 /opt/local/bin 裡。

DarwinPorts 所有安裝的程式,除了極少數例外,幾乎都是放在 /opt/local/ 這個目錄之下。這樣作的好處是,一旦你哪天想把整套 ports 幹掉,直接殺掉 /opt 就可以了。另一個好處是這樣可以跟原先放在 /usr/local 裡的檔案有所區分。當然,如果你希望 dports 把程式安裝在 /usr/local 也是可以的,請在 ./configure 那一步執行 ./configure --help 參閱可使用的選項,這裡就不多做描述了。

言歸正傳,如果你跟我一樣使用 bash 當 shell ,那麼你可以在 .bash_profile 裡加入這一行:
export PATH=$PATH:/opt/local/bin
重新進入 shell ,你就可以使用 port 了。

實際安裝 vim

port 的使用方法,只要打 man port 就一目瞭然。我們最常用的功能,不外乎下面三個:
  • port search xx 尋找 xx 套件(支援正規表式法,因此 port search .+ 會列出所有可安裝的 ports)
  • port install xx 安裝 xx 套件(如果你的身份不是 root ,需要 sudo)
  • port uninstall xx 解除安裝 xx 套件

除此之外,port 還有一些相當「高段」的功能,像是可以同時安裝同一個軟體的不同版本,然後可以選擇要「啟用」其中某個版本等等。這些功能我們有機會再來介紹。

要安裝 vim 相當簡單,我們可以先來看看 vim 的相關訊息,請執行 port info vim ,然後就會看到:
vim 6.3.62, editors/vim (Variants: aqua, gtk1, gtk2, motif, athena, xim, tiny, small, big, huge, multibyte, ncurses, ruby, tcl, perl, python, darwin x86)
http://www.vim.org/

Vim is a virtually compatible, extremely enhanced version of the vi editor.

Platforms: darwin freebsd
Maintainers: mij@opendarwin.org rshaw@opendarwin.org
這一串訊息告訴我們,目前在 port tree 裡面的 vim 版本是 6.3.62 版,其中還有各種不同的「安裝選項」,這裡稱做 variants 。我們如果需要安裝有亞洲文字編碼支援的 vim ,就得安裝 +multibyte 這個 variants (dports 以加號做為 variants 的開頭)。如果你要裝 OS X GUI 版的 vim ,則可以安裝 +aqua 這個 variants。

那麼就來裝吧:
sudo port install vim +multibyte
由於 dports 的所有套件都是從原始碼建起的,因此安裝過程要花上一段時間。裝完之後,我們可以用 port installed 這個指令,來看看目前裝了哪些程式。以 vim 來說,我們會在 /opt/local/bin 裡找到 vim 這個檔案。

由於 /usr/bin 裡已經有 Apple 預先裝好的 vim ,因此如果我們要用新裝的 vim ,我們可以用全名 /opt/local/bin/vim 來呼叫,或者我們也可以把 /usr/bin/vim 的名字改掉。一個比較優雅的方法,是回到 .bash_profile ,用 alias 的方式來呼叫:
alias vim="/opt/local/bin/vim"
這樣對系統的變動可以達到最小。

Apple 預裝的 vim 已經調校成 vi 的不相容模式,而我們用 port 安裝的 vim 用的還是預設的相容模式設定,因此習慣了 Apple 預裝 vim 的朋友一開始可能會覺得怪怪的,怎麼進入了插入模式後,四個方向鍵就不聽使喚了。我們可以在自己的家目錄 ~/ 中建一個 .vimrc ,並加入這一行:
set nocompatible
這樣就有很好用的 vim 了。要編有 UTF-8 的文件時,只要打 :set encoding=utf8 ,同理 Big5 的文件可以 :set encoding=big5 。我們當然可以把常用的編碼預設值放進 .vimrc 中。除此之外,vim 還支援相當強大的「終端機/檔案編碼分離」功能,我們可以終端機使用一種編碼 (termencoding),檔案使用另一種編碼 (fileencoding)。這個強大的功能有很多需要詳加說明的地方,這裡也就不多談了。digdog 畫了一張流程圖,大家可以參考看看。

用 port 安裝 vim 算是相當容易的。除此之外,像是 Perl, Apache 等程式也都可以透過 port 來安裝,安裝後的程式也都會放在 /opt/local 之下。不過像是 Perl, Apache 涉及的層面就廣得多,如何順利切換到自己安裝的 Perl 或 Apache 就有些額外步驟要做。我們就先介紹到這個地方了。

13 篇留言:

  • 這篇文章真是讓我受益良多啊!

    希望有空能多寫些這方面的介紹:-)

    作者: Blogger JuSofie 發表時間: 3/06/2005 10:36:00 下午  

  • 很好的文章呢
    有機會再多寫一些分享給大家吧

    作者: Anonymous 匿名 發表時間: 8/07/2005 11:01:00 下午  

  • 我從吳聰敏教授cwtex網頁看到你的介紹
    很佩服您的努力,提供mac用戶使用cwtex的方法
    我用darwin port安裝出現問題
    當我在terminal執行
    sudo port -q install wget
    指令時,收到以下錯誤訊息


    Error: Target com.apple.configure returned: configure failure: shell command "cd "/opt/local/var/db/dports/build/_opt_local_var_db_dports_sources_rsync.rsync.darwinports.org_dpupdate_dports_textproc_libiconv/work/libiconv-1.10" && MACOSX_DEPLOYMENT_TARGET=10.4 ./configure --prefix=/opt/local --enable-static --mandir=/opt/local/share/man" returned error 1
    Command output: checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for gawk... no
    checking for mawk... no
    checking for nawk... no
    checking for awk... awk
    checking whether make sets $(MAKE)... no
    checking whether make sets $(MAKE)... (cached) no
    checking for gcc... no
    checking for cc... no
    checking for cc... no
    checking for cl... no
    configure: error: no acceptable C compiler found in $PATH
    See `config.log' for more details.

    Error: The following dependencies failed to build: gettext libiconv openssl zlib
    Error: /opt/local/bin/port: Status 1 encountered during processing.


    請問我該如何解決呢?
    如蒙解答,請貼在bolg上
    或請寄至 joshuagau@gmail.com
    感激不盡

    作者: Anonymous 匿名 發表時間: 3/25/2006 12:07:00 上午  

  • joshuagau 您好

    > configure: error: no acceptable C compiler found in $PATH

    從這行錯誤看來,您需要的是一個 C 編譯器。請安裝 xcode。可以從 OSX CD 裡頭取得安裝程式,或是從 http://developer.apple.com/ 網站下載(得先成為網站的會員)。

    作者: Blogger gugod 發表時間: 3/25/2006 12:17:00 上午  

  • 謝謝 gugod
    我會照你的建議試試
    謝啦

    作者: Anonymous 匿名 發表時間: 3/29/2006 10:26:00 上午  

  • 我上次曾經問過您有關在osx上安裝cwtex的問題
    我試著解決問題
    已經到了安裝cwtex安裝檔的程序
    但我遇到了以下錯誤訊息

    This sh script will install the cwTeX for GNU/Linux.
    Please get your tarball from:
    ftp:/cle.linux.org.tew/pub/tex/cwtex/cwtex-1.63g-linux-1.tar.bz2
    ftp:/cle.linux.org.tew/pub/tex/cwtex/install.sh

    tar jcvf cwtex-1.63g-linux-1.tar.bz2
    cp install.sh texmf/
    cd texmf ; sh install.sh

    Press any key to install cwTeX!
    Ctrl-C to exit install sh script.


    cp: bin/*: No such file or directory
    install.sh: line 40: texhash: command not found
    install.sh: line 41: updmap: command not found

    似乎是 install.sh 中目錄的問題
    請問如何解決這樣的問題
    謝謝

    Joshua
    joshuagau@gmail.com

    作者: Anonymous 匿名 發表時間: 12/09/2006 07:00:00 下午  

  • Joshua:

    install.sh 裡面的註解指示,解開 cwtex tarball 之後,要先把 install.sh 拷貝到 texmf/ 目錄底下再執行,我想您應該是缺這一步吧。

    作者: Blogger gugod 發表時間: 12/09/2006 09:06:00 下午  

  • 謝謝您的解答
    我再試試

    JOSHUA

    作者: Anonymous 匿名 發表時間: 12/11/2006 12:38:00 上午  

  • 目前在我的 Mac 上有兩個目錄有 install.sh

    一個是 /opt/local/share/texmf-dist
    另一個是 /Users/Shared/cwtex

    我在這兩個目錄下執行都不行

    所謂 ~/texmf 目錄是指其中之一嗎?
    還是我應該在哪裡建立這個目錄?
    如果建立後,需要作什麼檔案搬移的動作嗎?

    抱歉,因為個人對 UNIX 指令不熟
    才一直麻煩您
    謝謝

    JOSHUA

    作者: Anonymous 匿名 發表時間: 12/11/2006 05:57:00 下午  

  • hello again

    我試了另一個做法,又有一點進展
    先前錯誤訊息顯示

    cp: bin/* ...

    我找到 install.sh 中對應的指令
    把它改成

    cp -r bin ...

    似乎上述修改就可以讓 cp 這個部分複製目錄的程式執行成功

    最後的問題了

    install.sh: line 40: texhash: command not found
    install.sh: line 41: updmap: command not found

    它找不到 texhash 以及 updmap 這兩個指令或批次檔
    我用尋找功能也找不到
    請問問題在哪裡呢?

    再次謝謝您

    JOSH

    作者: Anonymous 匿名 發表時間: 12/12/2006 10:56:00 上午  

  • 我的意思是... 其實您之前貼的「錯誤訊息」裡面就已經寫明方法了:

    This sh script will install the cwTeX for GNU/Linux.
    Please get your tarball from:
    ftp:/cle.linux.org.tew/pub/tex/cwtex/cwtex-1.63g-linux-1.tar.bz2
    ftp:/cle.linux.org.tew/pub/tex/cwtex/install.sh

    (把這兩個 FTP 連結的檔案抓下來)

    tar jcvf cwtex-1.63g-linux-1.tar.bz2
    cp install.sh texmf/
    cd texmf ; sh install.sh

    (執行這幾個指令)

    作者: Blogger gugod 發表時間: 12/13/2006 10:55:00 上午  

  • 謝謝
    我沒有看清楚error message
    我再試試
    謝謝

    作者: Anonymous 匿名 發表時間: 12/13/2006 09:20:00 下午  

  • 網誌管理員已經移除這則留言。

    作者: Anonymous 匿名 發表時間: 8/20/2009 11:47:00 上午  

張貼留言

逆向鍊結:

建立連結

? 回前頁