Ich bin ein absoluter Neuling im Verpacken, also verzeihen Sie mir, wenn ich eine für einen erfahrenen Verpacker offensichtliche Frage stelle …
Wie kann ich sicher sein, dass alle Abhängigkeiten in meinem Paket korrekt erwähnt werden?
Angenommen, meine Anwendung verwendet eine Bibliothek library-xyz
, die nicht standardmäßig installiert ist. Wenn ich das Paket erstelle und auf meinem Entwicklungscomputer installiere, library-xyz
ist es bereits installiert, sodass das Programm – auch wenn ich es nicht als Abhängigkeit erwähnt habe – trotzdem korrekt ausgeführt wird. Ein anderer Benutzer mit einer Neuinstallation von Ubuntu hat es jedoch nicht library-xyz
installiert und das Programm wird bei ihm wahrscheinlich abstürzen.
Ich teste es derzeit so, dass ich eine frische Ubuntu-Installation in einer VM laufen lasse und das Paket dort installiere. Da das aber ein häufiges Problem zu sein scheint, frage ich mich, ob es eine bessere Testmethode gibt, die die gleiche Philosophie verfolgt, chroot
aber statt Teile des Dateisystems „auszuschneiden“, würden alle installierten Pakete „ausgeschnitten“, die bei einer sauberen Ubuntu-Installation nicht „Standard“ sind.
Ich verpacke Python-Programme.
Antwort1
Das lintian
Programm wird nach dem Erstellen eines Pakets ausgeführt debuild
und sollte Sie beim Erstellen eines Binärpakets vor fehlenden Bibliotheken warnen. Mit dem ldd
Befehl können Sie überprüfen, welche Bibliotheken für ein Paket benötigt werden.
Ich verwende das folgende Skript, um Abhängigkeiten von Bibliothekspaketen schnell abzurufen:
#!/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
Bei großen Verzeichnissen kann der Befehl eine Weile dauern, da er jede Datei einzeln testet. Er kann optimiert werden, indem zuerst eine Liste der Bibliotheken erstellt wird und dann die eindeutigen Einträge an den dpkg -S
Befehl übergeben werden. Dies ist jedoch eine Übung für den Leser.
Beispiel: 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
Antwort2
Wie in meinem Kommentar oben zu pbuilder erläutert, ist es hauptsächlich zum Überprüfen von Build-Abhängigkeiten nützlich (ähnlich dem Hochladen des Pakets auf ein Launchpad-PPA). Zum Überprüfen von Abhängigkeiten ist es jedoch nicht sinnvoll, es sei denn, Sie fügen Ihren Verpackungsskripten einige zusätzliche Schritte hinzu, z. B. das Ausführen von Komponententests.
Eine andere ähnliche Lösung (Tests in einer eingeschränkten Umgebung ausführen), wenn Sie nur Abhängigkeiten von Python-Bibliotheken berücksichtigen, wäre die Erstellung einesvirtuelle Umgebungdamit Sie die Kontrolle über die während des Tests verfügbaren Python-Bibliotheken haben. Ein nützliches Tool zum Verwalten der virtuellen Umgebungen mit mehreren Python-Versionen während der Ausführung der Tests wäreGiftig.
Dadurch werden die Abhängigkeiten zwar nicht für Sie zur debian/control
Datei hinzugefügt, es könnte aber trotzdem hilfreich sein.