Я абсолютный новичок в упаковке, поэтому простите, если я спрашиваю что-то очевидное для опытного упаковщика...
Как я могу быть уверен, что все зависимости в моем пакете указаны правильно?
Допустим, мое приложение использует lib library-xyz
, которая не установлена по умолчанию. Если я соберу пакет и установлю его на своей машине для разработки, он 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
решение2
Как я объяснил в своем комментарии выше относительно pbuilder, он полезен в основном для проверки зависимостей сборки (аналогично загрузке пакета в PPA на Launchpad), но не будет полезен для проверки зависимостей, если вы не добавите некоторые дополнительные шаги в свои скрипты упаковки, например, запуск модульных тестов.
Другим похожим решением (запуск тестов в ограниченной среде), если вы просто рассматриваете зависимости от библиотек Python, было бы созданиевиртуальное окружениетак что вы контролируете библиотеки python, доступные во время тестирования. Один инструмент, который был бы полезен для управления виртуальными средами, использующими несколько версий python во время выполнения тестов, этотокс.
Это не добавит зависимости в debian/control
файл, но в любом случае может быть полезно.