Debian Deb Package
每一種 Linux Distribution 在系統層面都會內建基本的套件管理工具,用來管理各種套件或函式庫的安裝與升級,並維護程式套件之間的相依關係。Linux 中兩大主流的套件管理工具,分別是 Red Hat 體系的 RPM 與 Debian 體系的 DEB。今天介紹如何透過 dpkg 這個命令還封裝自己的套件,方便將程式進行散佈與部署。
Deb 套件介紹
在 Debian 系統中通常使用 dpkg 這個命令來打包程式或函式庫,除了要準備好我們要打包的程式碼之外,還需要撰寫一個套件描述檔,好讓我們描述套件與其他套件之間的相依關係。使用 dpkg 進行封裝時請先準備好以下的目錄與檔案:
上圖 DEBIAN 資料夾中的 control 檔案就是套件打包最最重要的描述檔,透過 control 可以定義套件相關資訊,範例的內容如下:
Package: package-name Version: 1.0.0.0 Architecture: all Maintainer: SJ Chou <[email protected]> Installed-Size: 16 Depends: php5 (>=5.5.9), php5-curl (>=5.5.9), php5-mongo (>=1.4.5) Section: web Priority: optional Homepage: https://blog.toright.com Description: This is debian package build example
先介紹一下 deb-control 控制檔中比較重要的幾個設定
- Package: 套件的名稱,在系統中必須是唯一的代號,慣例上用英文小寫與「-」組成
- Version: 套件版本號
- Architecture: 指定套件可執行的架構:例如 i368, amd64, sparc... 等等,也可以用 all 表示所有的平台皆可執行
- Maintainer: 維護者資訊
- Installed-Size: 安裝解壓縮後需要的磁碟空間
- Depends: 描述這個套件相依的其他套件,用來確保安裝後可以正確執行,非常好用
DEBIAN 目錄中除了上面介紹的 control 控制檔,還有 postinst, preinst, postrm, prerm 這幾支檔案。這些檔案稱為 Maintainer Scripts,其實也就是一些在安裝與解除安裝過程中會被執行的 Script 執行檔,用來定義套件安裝與反安裝的過程需要執行的動作,詳細的執行的流程請參考「Maintainer Scripts」這裡的說明。
前面介紹的目錄結構中,除了 DEBIAN 目錄之外,整個資料夾就是對應到系統的 Root 根目錄上,我們可以把要安裝程式碼放在對應的路徑中,這些檔案被系統安裝後就會被進行管理,因此每一個套件中的檔案相對於系統跟目錄不可重複,避免管理上的麻煩。如果是一些設定檔,建議在 postinst Script 中進行安裝,這樣的設計會比較好。
利用 dpkg 命令進行打包
準備好上面的資料與檔案後,就可以透過以下命令執行套件打包:
dpkg -b ./package-name/ package-name_1.0.0.0.deb
執行完後會產生 deb 檔案,接著我們可以用 dpkg -i 來進行安裝,命令如下:
sudo dpkg -i package-name_1.0.0.0.deb
執行畫面如下:
打包的過程最麻蠻的就是那個 Installed-Size 的計算,因此我們遵循 Linux 的慣例來設計一個 Makefile 讓我方便製套件檔,Makefile 內容如下:
PACKAGE_NAME="package-name" VERSION=1.0.0.0 all :: @echo "[INFO] Create debian package file (control)." rm -rf ./${PACKAGE_NAME}/DEBIAN/control ;\ cp ./${PACKAGE_NAME}/DEBIAN/control.sample ./${PACKAGE_NAME}/DEBIAN/control ;\ SIZE=`du -sx --exclude DEBIAN "${PACKAGE_NAME}/DEBIAN/" | awk '{print $$1}'` ;\ sed -i "s/Installed-Size: 0/Installed-Size: $${SIZE}/g" "./${PACKAGE_NAME}/DEBIAN/control" ;\ sed -i 's/Version: 0.0.0-0/Version: ${VERSION}/g' "./${PACKAGE_NAME}/DEBIAN/control" ;\ cat ./${PACKAGE_NAME}/DEBIAN/control @echo "[INFO] Build Deb Package." mkdir -p ./dest rm -rf "./dest/${PACKAGE_NAME}_${VERSION}.deb" dpkg -b "./${PACKAGE_NAME}" "./dest/${PACKAGE_NAME}_${VERSION}.deb" install :: dpkg -i "./dest/${PACKAGE_NAME}_${VERSION}.deb"
可以直接修改 PACKAGE_NAME 與 VERSION 參數,然後我們僅需要執行 make 命令後就可以直接打包出檔案 (在 ./dest 目錄中)。並且透過 make install 進行安裝,是不是方便多了呢?執行畫面如下:
介紹完囉,上述的所有範例程式在 GitHub 中,需要的大大請自行服用。有了自行打包的套件後,在網路服務的佈署工作上蠻方便的,可以快速地進版與退版,自動化才是王道。如果是 Red Hat 系統其實也是差不多的流程,RPM 的封裝我就留到下次再介紹囉。