Концепция provides и её реализация в mpkg

Иногда (а в последнее время - особенно часто) возникает ситуация, когда один и тот же функционал могут предоставлять разные пакеты. Зачастую это одна и та же программа, но собранная по-разному. Чтобы их различать и корректно учитывать во всех операциях - был реализован механизм, основанный на поле provides в метаданных пакета.

Пример

Самый простой пример - mplayer. Он может быть собран как с поддержкой VDPAU, так и без неё. Однако первый вариант будет работать только у тех, у кого видеокарта от NVidia и стоят проприетарные драйвера. При этом второй вариант будет работать у всех, но не сможет использовать возможности этих карт по аппаратному ускорению видео.

Тогда мы делаем два пакета:

Первый - самый обычный:

  • Имя файла: MPlayer-r29384-i686-1.txz
  • Имя пакета: MPlayer
  • provides: (пусто)

И второй пакет:

  • Имя файла: MPlayer-vdpau-r29384-i686-1.txz
  • Имя пакета: MPLayer-vdpau
  • provides: MPlayer

Строго говоря, это разные пакеты (ибо у них разное имя). Однако, за счет поля provides, мы знаем, что они взаимозаменяемы. Тогда:

  1. при установке одного из них другой будет удален,
  2. зависимости будут связаны с именем MPlayer, вне зависимости от того какой из вариантов пакета установлен.
  3. при обновлении пакета он будет обновлен именно на тот вариант, что вы выбрали.

Как с этим работать

Установка альтернативного варианта

Просто попросите mpkg установить нужный вам вариант:

mpkg install MPlayer-vdpau

И тогда обычный пакет будет заменен указанной вариацией.

Сборка таких пакетов

Достаточно просто прописать нужное поле в метаданные пакета с помощью mpkg-setmeta:

mpkg-setmeta $PKG --provides=MPlayer
Поддержка в mpkg и репозитории

Для репозитория, разные варианты пакета - это разные пакеты, следовательно и мейнтейнеры у них могут быть разные. Однако зависимости указываются с учетом provides.

В mpkg поддержка имеется начиная с ревизии 489.


Navigation
Personal Tools