Есть ли способ проверить правильность зависимостей в собираемых мной пакетах?

Есть ли способ проверить правильность зависимостей в собираемых мной пакетах?

Я абсолютный новичок в упаковке, поэтому простите, если я спрашиваю что-то очевидное для опытного упаковщика...

Как я могу быть уверен, что все зависимости в моем пакете указаны правильно?

Допустим, мое приложение использует 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файл, но в любом случае может быть полезно.

Связанный контент