我對包裝完全陌生,所以如果我對經驗豐富的包裝商提出一些顯而易見的問題,請原諒我...
我如何確定我的套件中正確提及了所有依賴項?
假設我的應用程式使用library-xyz
預設未安裝的 lib。如果我建立該軟體包並將其安裝在我的開發電腦上,library-xyz
則該軟體包已安裝,因此 - 即使我未能將其作為依賴項提及 - 程式仍將正確運行。但是另一個全新安裝 ubuntu 的用戶不會library-xyz
安裝,而且程式可能會崩潰。
我現在測試的方式是在虛擬機中運行一個新的 ubuntu 安裝並在那裡安裝軟體包,但由於這似乎是一個常見問題,我想知道是否有更好的測試方法,採用相同的理念,chroot
但-不是「刪除」檔案系統的某些部分,而是「刪除」所有那些在乾淨的ubuntu 安裝中不是「預設」的已安裝軟體包。
我正在打包 python 程式。
答案1
該lintian
程式在使用建置包後運行debuild
,並在構建二進制包時警告您缺少庫。該ldd
命令可用於檢查套件需要哪些庫。
我使用以下腳本快速獲取庫包依賴項:
#!/bin/sh
# Save it as executable ~/bin/pkglibs
# Usage: pkglibs directory
# pkglibs file
list_lib_pkgnames() {
local lib="$1" libs
# get the libraries for given "$lib", stripping out linker libraries
libs=$(ldd "$lib" | awk '/=/{print $1}' | grep -vE '^(linux-vdso|linux-gate)\.so\.1$')
# if there are libraries, find the matching packages for it
[ -n "$libs" ] && dpkg -S $libs | sed 's/: .*//'
}
search="$1"
if [ -d "$search" ]; then
# for directories, recursively search for library dependencies
find "$search" -type f -exec "$0" {} \; | sort -u
else
list_lib_pkgnames "$search"
fi
對於大型目錄,該命令可能需要一段時間,因為它會單獨測試每個檔案。可以對其進行最佳化,首先產生庫列表,然後將唯一條目傳遞給命令dpkg -S
,但這對讀者來說是一個練習。
例:pkglibs /usr/lib/mesa/
:
ia32-libs
lib32gcc1
lib32stdc++6
libc6
libc6-i386
libdrm2
libgcc1
libstdc++6
libx11-6
libxau6
libxcb1
libxdamage1
libxdmcp6
libxext6
libxfixes3
libxxf86vm1