В настоящий момент я собираю и упаковываю наше программное обеспечение для Ubuntu 14.04, также называемое «надежным» через dpkg-buildpackage
. Я получаю пакет .deb
, который можно установить как в Ubuntu 14.04, так и в других выпусках Ubuntu, например. 12.04 ака "точный". Это опасно, так как программное обеспечение может быть установлено без сообщения об ошибке, но программа не может работать / работать правильно.
Зависимости моего пакета приведены в файле control
. Однако этот файл не позволяет мне вводить дистрибутив / кодовое имя Ubuntu. Распределение может быть введено как часть *.changes
, но это нигде не отражено в файле .deb. Проверка сложной ситуации с зависимостями во время постинсталляционного скрипта также сложна. Поэтому я хочу простой способ предотвратить установку пакета Ubuntu в неправильный выпуск Ubuntu.
Как лучше всего создать пакет, предназначенный только для одного выпуска Ubuntu? В лучшем случае (1) установка должна работать только на целевой версии Ubuntu и (2) пакет .deb
содержит имя дистрибутива *, например, как package_1.0.0-3_trusty_amd64.deb
.
(*) В противном случае хранилище apt, управляемое через reprepro
, не может иметь два пакета с одинаковым номером версии, каждый из которых предназначен для своего выпуска Ubuntur.
Спасибо заранее.
Обновление:
Файл debian/control
моего пакета:
Source: mypackage
Priority: extra
Build-Depends: debhelper (>= 9), python (>=2.7), pyside-tools
X-Python-Version: >= 2.7
Standards-Version: 3.9.2
Package: mypackage
Architecture: amd64
Depends: ros-indigo-desktop-full|ros-hydro-desktop-full, ros-indigo-rqt|ros-hydro-rqt, ros-indigo-gps-umd|ros-hydro-gps-umd, ros-indigo-map-server|ros-hydro-map-server, imagemagick, octave (>= 3.6), libdc1394-22, sox, tree, python (>=2.7), python-psutil, python-usb, python-serial, python-gi, gir1.2-gexiv2-0.10|gir1.2-gexiv2-0.4, exfat-fuse|fuse-exfat, exfat-utils, gphotofs, python-pyproj, libusb-1.0-0 (>=2:1.0.17), libpyside1.2|libpyside1.1 (>=1.1.2), ${shlibs:Depends}, ${misc:Depends}
Description: ...
Как видно, этот файл управления был адаптирован так, что мы можем запустить основываться на нескольких выпусках Ubuntu, где зависимости имеют разные номера версий: libpyside1.2|libpyside1.1 (>=1.1.2)
. Есть ли лучший способ справиться с этим?
Поскольку ваш пакет установлен в выпуске / среде, в которой он не может работать, это означает, что ваши пакеты управляют
в зависимостях чего-то не хватает.
Я ожидаю, что вы не указали условия версии зависимостей, которые могли бы использоваться для установки пакета в одном выпуске, если версия зависимостей доступна только в этом выпуске, например gedit: gedit-common (> = 3.10), gedit-common (<< 3.11)
Зависит от: libatk1.0-0 (> = 1.12.4), libc6 (> = 2.14), libcairo2 (> = 1.2.4 ), libenchant1c2a (> = 1.6.0), libgdk-pixbuf2.0-0 (> = 2.22.0), libgirepository-1.0-1 (> = 0.9.3), libglib2.0-0 (> = 2.38), libgtk-3-0 (> = 3.10), libgtksourceview-3.0-1 (> = 3.10.0), libpango-1.0-0 (> = 1.14.0), libpeas-1.0-0 (> = 1.1 .0), libx11-6, libxml2 (> = 2.7.4), libzeitgeist-2.0-0 (> = 0.9.9), gedit-common (> = 3.10), gedit-common (<< 3.11), gsettings- настольные схемы, python3-gi (> = 3.0), python-gi-cairo (> = 3.0), gir1.2-peas-1.0, iso-коды
Рекомендует: gir1.2-gtksource-3.0, zenity, yelp
Предлагает: gedit-plugins
Перерывы: gedit-plugins (<< 2.91)
Ссылка: Руководство по политике Debian: Глава 7. Объявление взаимосвязей между пакетами
Другой способ использования сценария preinst
и команды lsb_release
:
#! / Bin / ш
set -e
релиз = $ (lsb_release -cs)
если [ ! "$ release" = "надежный"]
тогда
echo "Эти пакеты не были созданы для вашего выпуска."
echo "Пакет не установлен, смотрите ..."
выход 1
фи
выход 0
Если вы хотите, чтобы trusty
был определен при сборке, вы можете создать шаблон как preinst.in
и написать make-файл для выполнения подстановки переменных при сборке исходного кода.
В пакете Debian нет способа сказать «Разрешить установку только на 14.04». Это должно произойти на уровне подходящего репозитория (к которому я вернусь чуть позже). Полу-исключение из этого состоит в том, что, поскольку Trusty новее, чем Precise, Trusty будет иметь переименованные некоторые пакеты библиотек (что, пока пользователь не использует PPA, который предоставляет эти пакеты, сделает их удаляемыми) и будет иметь более новые версии библиотеки, для которых dh-shlibdeps
может добавить требования к версии. Таким образом, в обоих случаях пакет будет невозможно удалить в Precise. Обратите внимание, что пакет, созданный для Precise , может быть установленным в Trusty.
Что касается репозитория apt, пакеты имеют отдельный номер версии debian для каждого выпуска. Формат, который вы описываете, может работать, хотя использование ~
более распространено, отчасти потому, что ~
меньше, чем все другие символы, и поэтому, если пользователь обновляется до более новой версии (например, с Precise to Trusty), и пакет присутствует в официальных репозиториях (с номером версии 1.0.0-3
, тогда пользователь обновится с 1.0.0-3 ~ точный1
на 1.0.0-3
, даже если у вас есть 1.0.0-3 ~ trusty1
. Это не применимо, если вы используете какой-либо другой символ. Я лично использую что-то вроде 1.0.0-0ubuntu1 ~ ppa1 ~ точный1
; часть ~ ppa1
призвана сделать его меньше, чем любой официальный пакет Ubuntu, который может появиться в будущем, и ~ точный1
, чтобы указать выпуск. Другие сопровождающие PPA могут использовать 1.0.0-3 ~ 12.04.1
или 1.0.0-3 ~ 14.04.1
, указав номер версии вместо кодового имени, которое гарантированно будет увеличиваться (поскольку l ong, поскольку номера версий Ubuntu не сбрасываются).
Обратите внимание, что двоичные пакеты имеют один и тот же исходный пакет, поэтому вам нужно убедиться, что ваш файл .changes
не включает исходный пакет.