Могу ли я добавить что-то вроде антизависимости в пакет Debian?

У меня есть два пакета одной и той же библиотеки, но с очень разными API. Каждая версия этой библиотеки должна иметь свой собственный пакет, например. lib1.deb и lib2.deb. Я не хочу переименовывать все библиотеки и заголовки, чтобы сделать их сосуществующими, но тогда некоторые библиотеки/заголовки будут иметь один и тот же путь/перезаписывать друг друга. В «контрольном» файле, когда f.i. создание пакета с помощью debuild, могу ли я как-то указать пакет, который не должен устанавливаться одновременно с установкой моего другого пакета? Было бы неплохо, если бы при попытке установить package2 apt автоматически захотел удалить package1. Кажется, я уже видел что-то подобное при установке пакетов.


person Magnus Lutz    schedule 29.01.2018    source источник


Ответы (2)


Вам все же следует рассмотреть возможность совместной установки этих пакетов (только представьте, вам нужно установить графическую программу, и apt хочет удалить весь ваш сетевой стек только потому, что какой-то «умный» сопровождающий пакетов решил, что гораздо проще установить Conflicts чем решить проблему).

Обычно это не так сложно:

  • поместите все файлы заголовков в подкаталоги, специфичные для библиотеки, например. /usr/include/lib1/ соотв. /usr/include/lib2/ (в любой хорошо написанной библиотеке должен быть файл pkg-config, который все равно нужно обновлять).

  • обычно файлов библиотеки немного, в основном 3 (libfoo.so.x.y, libfoo.so.x, libfoo.x). переименование их по отдельности должно быть достаточно простым. (и снова обновите файл pkg-config, чтобы отразить изменение имени).

Наконец: «два пакета одной библиотеки, но с очень разными API» в целом звучит как очень плохая идея. почему у них одна и та же библиотека, если у них нет одного и того же API/ABI?

О, и если речь идет только о (несовместимых) версиях, это обычно обрабатывается так:

  • libfoo3 - это пакет libfoo с ABI-версией 3, например. он предоставляет /usr/lib/libfoo.so.3.14 и /usr/lib/libfoo.so.3, который является символической ссылкой на прежний
  • libfoo7 is the package of libfoo with ABI-version 7 e.g. it provides /usr/lib/libfoo.so.7.42 and /usr/lib/libfoo.so.7 which is a symlink to the former)
    • libfoo-dev is the development package, which provides the headers and a symlink /usr/lib/libfoo.so to the correct ABI soname (/usr/lib/libfoo.so.3 resp /usr/lib/libfoo.so.7). this package has a Depends on the correct libfooX, using an exact version specifier.

У вас может быть установлена ​​только одна версия libfoo-dev (поскольку apt запрещает установку одного пакета несколько раз). Однако вы можете установить и libfoo3, и libfoo7 параллельно (что важно для использующих их приложений).

person umläute    schedule 29.01.2018
comment
было бы нормально иметь пакеты libfoo3-dev или это плохая практика? И включаемый каталог будет /usr/include/foo3 вместо /usr/include/libfoo3 по соглашению, верно? - person Magnus Lutz; 30.01.2018
comment
если вы хотите, чтобы пакеты разработчика (lib*-dev) обеих версий можно было установить совместно, вы, конечно, можете libfoo3-dev. есть ряд пакетов, которые делают это (apt-cache search lib*[0-9]-dev), но это не очень распространенный шаблон. что касается путей включения, существуют оба соглашения (просто проверьте свой путь /usr/include - например, здесь я нахожу как /usr/include/harfbuzz, так и /usr/include/libsoup-2.4/). если суффикс номера версии специфичен для вашего пакета, я думаю, что обычно используется тире: /usr/include/foo-3 - person umläute; 30.01.2018

Хм, нашел сообщение на stackexchange, посвященное этому https://unix.stackexchange.com/a/393243

есть ключевые слова «Разрывы» и «Конфликты», которые выглядят как https://www.debian.org/doc/debian-policy/#conflicting-binary-packages-conflicts

person Magnus Lutz    schedule 29.01.2018