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

В настоящий момент я собираю и упаковываю наше программное обеспечение для 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). Есть ли лучший способ справиться с этим?

2
задан 14 July 2014 в 12:31

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-файл для выполнения подстановки переменных при сборке исходного кода.

2
ответ дан 14 July 2014 в 12:31

В пакете 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 не включает исходный пакет.

2
ответ дан 14 July 2014 в 12:31

Другие вопросы по тегам:

Похожие вопросы: