應用程式打包技術之二(deb篇)
應用程式打包技術之二(deb篇)
資料來源: http://yangwenbo.com/articles/packaging-2-deb.html
deb 是 Debian 系 Linux 使用的套裝軟體格式,也是我最欣賞的套裝軟體格式。我所知道的打 deb 套裝軟體的方法有兩種,一種是使用 checkinstall,另一種是使用 dpkg。
checkinstall 不僅僅可以用來打 deb 包,還可以打 rpm 和
tgz 包,而且使用方法相對簡單。但是 checkinstall 的運行不是那麼穩定,我搞不懂它在什麼情況下才能正常運行,而且它的定制性不是很強,使用時老是要交互地輸入些資訊,所以我還是放棄了使用它來打包軟體。感興趣的朋友可以在網上搜索一下這個程式的使用方法。
dpkg 是 Debian 的“原生”包管理軟體,但是很多人不太願意使用 dpkg 來打包 deb。究其原因可能是需要寫麻煩的設定檔,但是寫設定檔的一個好處就是在下次打包時候可以直接用上次的設定檔,只修改一個版本號就可以了,而不用每次都需要填包資訊。在介紹如何打 deb 包之前,我們現看一下如何解 deb 包。
$ sudo
apt-get install tree
$ dpkg -X /var/cache/apt/archives/tree_1.5.1.1-1_i386.deb fakeroot
$ cd fakeroot
$ dpkg -e /var/cache/apt/archives/tree_1.5.1.1-1_i386.deb
$ tree
.
|– DEBIAN
| |– control
| `— md5sums
`— usr
|– bin
| `— tree
`— share
|– doc
| `— tree
| |– README
| |– changelog.Debian.gz
| |– changelog.gz
|
`— copyright
`— man
`— man1
`— tree.1.gz
dpkg -X 是將 deb 包的內容檔釋放出來,dpkg -e 是將 deb 包的控制資訊釋放出來。前面執行那個 sudo apt-get install tree 是為了將
tree_1.5.1.1-1_i386.deb 下載到本地 apt cache,如果您已經安裝過 tree 這個軟體,可以為 apt-get 加上 -d 參數,使其只下載而不安裝。
從上面
tree 命令的執行結果我們發現,deb 包解開後分兩部分:一部分是控制資訊,在 DEBIAN 目錄下;一部分是安裝內容,在 usr 目錄下。現在您大概明白為什麼我們使用
fakeroot 作為目錄名了,因為這個目錄就是一個“假根目錄“,您在這個目錄下所有的修改,最後都會被映射到目的機的根目錄 / 下。比如 fakeroot/usr/bin/tree 這個檔,就會被安裝到 /usr/bin 下,以此類推。
只要您能理解
fakeroot 這個目錄映射,您就知道如何安放自己的檔了。為了讓生成的包將檔 foo 安裝到目錄
/usr/xx/yy 目錄下,您只用在 fakeroot 目錄下建立 usr/xx/yy 目錄,並將 foo 拷貝進去就行了。
好,下面進入關鍵的設定檔部分,關於 control 和 md5sums。
$ more DEBIAN/control
Package: tree
Version: 1.5.1.1-1
Architecture: i386
Maintainer: Ubuntu MOTU Developers
Original-Maintainer: Florian Ernst
Installed-Size: 92
Depends: libc6 (>= 2.6-1)
Section: utils
Priority: optional
Description: displays directory tree, in color
Displays an indented directory tree, using the same color assignments as
ls, via the LS_COLORS environment variable.
.
Homepage: http://mama.indstate.edu/users/ice/tree/
我們可以看到,control 檔中包含的主要是軟體的版本和維護者資訊,我相信大家都能基本看懂上面這些資訊什麼意思:Package 包名(tree)、Version
版本(1.5.1.1-1)、Architecture 目的機架構(i386 386及以後)、Maintainer 維護者(Ubuntu MOTU Developers)、Original-Maintainer 原維護者(Florian Ernst)、Installed-Size 安裝後大小(92K)、Depends 依賴套裝軟體(libc6
不低於 2.6-1 版本)、Section 包分類(工具)、Priority 優先順序(可選)、Description 包描述、Homepage 軟體主頁。
由於咱們分析這個包是 Ubuntu 發佈的包,所以包資訊給的比較全,其實並不是上面所有的資訊都有必要提供(小聲說一句,就算全提供也不是很難吧?除了咱不用的,Original-Maintainer 這種就算了)。關於哪些資訊比較重要,以及每個域的具體含義和可選項,可以參考 Debian 的文檔 Debian Policy Manual Chapter 5 – Control files and their fields 。
您也可以依樣畫葫蘆,寫一個類似的 control 檔放到 DEBIAN 目錄下,提供一些自己套裝軟體的資訊,基本有這個設定檔就可以打包了。
$ more DEBIAN/md5sums
d60a3b4736f761dd1108cb89e58b9d4e usr/bin/tree
981ea0343c2a3eb37d5fc8b5ac5562df usr/share/man/man1/tree.1.gz
483a56158a07a730ec60fc36b3f81282 usr/share/doc/tree/README
ea56d78ae0d54693ae8f3c0908deeeff usr/share/doc/tree/copyright
4456e04c3c268eabcd10ee9b949a9b9a usr/share/doc/tree/changelog.gz
ec104db6914cfce2865a0d8c421512bb usr/share/doc/tree/changelog.Debian.gz
md5sums,這檔案名一看,就知道是保存著套裝軟體中各檔的 md5 校驗值,用來校驗套裝軟體是否被損壞了。其實這個檔純屬“臘月三十逮兔子,有它沒它都過年”,您可以完全不提供它。
這樣呢,我們就準備好了 deb 包的內容檔和控制資訊:控制檔放在了 fakeroot/DEBIAN 目錄下,內容檔放在 fakeroot/usr 下,目錄樹就像開頭 tree 命令的結果。下面只需要一個命令就能打出來 deb 安裝包了:
$ cd ..
$ dpkg -b fakeroot/ foo.deb
這時候目前的目錄下就出現了 foo.deb。您可以使用 dpkg -I foo.deb 查看
foo.deb 的控制資訊,dpkg -c foo.deb 查看 foo.deb 包含了什麼檔,sudo dpkg -i 安裝 foo.deb。
小技巧:
1. 如果您懶得自己新建一個控制檔和目錄樹,您完全可以像本文開頭那樣,找一個簡單的套裝軟體,將它的內容和控制資訊釋放出來,對它進行修改,然後打出來自己的包。
2. 生成 md5sums 檔不是什麼難事,您只需要在 fakeroot 目錄使用下面這個命令:
$ md5sum `find usr -type f` > DEBIAN/md5sums
或者
$ find usr/ -type f -exec md5sum {} + > DEBIAN/md5sums
3. 將您的可執行檔拷貝到 fakeroot/usr 下並不一定要手動一個個拷。如果您使用 GNU 自動工具集,./configure 時加個參數 –prefix=fakeroot/usr/ 即可;如果您自己寫的 Makefile,可以在 Makefile 中使用一個變數 PREFIX=/usr,當您不加參數時,make install 的安裝目標就是 /usr 下,您可以使用 Makefile -e
PREFIX=fakeroot/usr/ install
來覆蓋 Makefile 中的變數設置。