用 apt-get 節省系統開發和評估的時間

使用 Debian 系統(包括 Ubuntu)的人,應該早就熟於使用 apt-get 去安裝、移除或更新系統,其無痛和方便的操作,帶給 Debian 家族很大的優勢。而對於研發人員而言,我們比較在乎的是如何取得各套件的程式碼,更在乎的是能在『不出錯』的情況下將取得的程式碼完整編譯通過。

你可能碰到過一種情況,辛辛苦苦從各程式的專案首頁去抓回 Source Code 後,卻怎麼也無法在自己的電腦上編譯,單純點的情況是相依性問題,複雜點則是在不同系統上的相容問題,更誇張的是根本不清楚下載回來的 Source Code 是不是『真的沒問題』。相信很多人早已浪費過不少生命在這些麻煩問題上,導致開發效率低落,不過以上問題,卻在 Debian 裡相當容易解決,因為 apt-get 提供了一系列選項,讓我們輕易從下載原始碼、解決相依性問題、到確保通過編譯一次搞定。

# 下載套件原始程式碼:
apt-get source <package>
# 安裝該套件編譯過程必要的東西
apt-get build-dep <package>

從 apt-get 下載回來的程式碼,會在自動解開時將該 Package Maintainer 所做的 Patch 一併打進程式碼,以此方法解決系統相容性問題,這邊用 lxterminal package 為例,粗字部份就是在解壓縮時上的 patch:
$ apt-get source lxterminal
正在讀取套件清單... 完成
正在重建相依關係          
正在讀取狀態資料... 完成
NOTICE: 'lxterminal' packaging is maintained in the 'Git' version control system at:
git://git.debian.org/git/collab-maint/lxterminal.git
需要下載 293kB 的原始套件檔。
下載:1 http://ftp.tw.debian.org/debian/ sid/main lxterminal 0.1.8-2 (dsc) [1,372B]
下載:2 http://ftp.tw.debian.org/debian/ sid/main lxterminal 0.1.8-2 (tar) [280kB]
下載:3 http://ftp.tw.debian.org/debian/ sid/main lxterminal 0.1.8-2 (diff) [11.2kB]
取得 293kB 用了 1s (240kB/s)    
dpkg-source: info: extracting lxterminal in lxterminal-0.1.8
dpkg-source: info: unpacking lxterminal_0.1.8.orig.tar.gz
dpkg-source: info: unpacking lxterminal_0.1.8-2.debian.tar.bz2
dpkg-source: info: applying alt-number-key.patch
dpkg-source: info: applying hide-menu.patch
dpkg-source: info: applying fix_shortcuts.patch

再經過 apt-get build-dep 指令,會將 package 編譯需要的 library 或 Headers 安裝好,然後就可以接著用 ./configure 和 make 等步驟開始編譯了,如果沒有特殊意外(如:某些 package 需在 ./configure 的階段設定自有的參數),通常都會無痛編譯成功。

後記

通常在教育訓練或是和朋友談論研發議題時,總是推薦使用 Debian 系列的 Linux 發行版本(Debian 或 Ubuntu),通常原因就是其套件管理軟體能節省我們大量時間,而且其 Package 進入 Repository 的省核和驗證相當嚴格,並不容易得到壞的 source code package 。

留言

  1. 用 source based Gentoo Linux 也是很不錯的選擇喔!
    Cross compiling 時很方便的. 尤其是當有 customize package features 時特別好用 (以 global USE flag 完成), 不需要一個一個去調整.
    麻煩的是有時候會 build 失敗要自已找問題, 安裝時間也會長些.

    回覆刪除

張貼留言

這個網誌中的熱門文章

Web 技術中的 Session 是什麼?

上手使用 JavaScript 的 Map、Reduce 吧!

淺談 USB 通訊架構之定義(二)

JavaScript 好用的 async 異步函數!

淺談 USB 通訊架構之定義(一)