2015-05-06 4 views
1

Пусть пакетов Я строящие для myprog1 и myprog2 должны установить в/USR/Lib/mysystem/myprog1/и/USR/Lib/mysystem/myprog2/rpmbuild: общая собственность каталогов

По некоторым дистрибутивам ', например, в случае OpenSUSE, оба пакета должны владеть общим каталогом. Но как это происходит в файлах .spec? Правильно ли следующее?

%files 
/usr/lib/mysystem 

или мне нужно сделать

%files 
%dir /usr/lib/mysystem 
/usr/lib/mysystem/myprog<1|2> 

ответ

0

Обычно только один пакет принадлежит данный каталог. В типичной системе будет такой пакет, как «файловая система», который может иметь такие вещи, как /bin. В случае пакета filesystem на Red Hat и OpenSUSE этот пакет владеет /usr/bin, но ни один из файлов в этом каталоге.

Вы можете сделать это, создав пакет-упаковку, который владеет вещами, которые используются в ваших приложениях, и делает его зависимым (Requires) приложений, которые устанавливаются в эти каталоги.

Чтобы увидеть, что на самом деле имеет кое-что с оборотов в минуту, вы можете использовать -qf варианты, например,

rpm -qf /usr/lib/mysystem/myprog 

Команда работает для каталогов, а также файлы.

Документация для %dir и %files - это место для начала, когда вы решаете, как сделать собственный каталог. В Maximum RPM: Taking the Red Hat Package Manager to the Limit, глава 13 Directives For the %files list, он говорит:

Как мы уже упоминали в the section called The %files List, если каталог указан в % файлах списка, содержимые этот каталог, и содержимое каждой директории под он будет автоматически включен в комплект поставки

Способ устранения этого вопроса состоит в том, чтобы использовать директиву % dir. Добавив эту директиву в строку, содержащую каталог, RPM будет упаковывать только сам каталог, независимо от того, какие файлы находятся в каталоге во время создания пакета. Вот пример % dir в действии.

%dir /usr/blather 

Так последний из предложенных случаев следует документации. Тем не менее, как проверка правильности синтаксиса (даже если rpm происходит для сборки), хорошей практикой является проверка списка путей.

Исследование Fedora 21 для поиска пакетов, для которых rpm -qf показывает тот же каталог, что и несколько. Например, initscripts и chkconfig использовать %dir директиву, чтобы сделать это:

%dir /etc/rc.d 
%dir /etc/rc.d/rc[0-9].d 
%dir /etc/rc.d/init.d 

в initscripts спец-файл, и

/etc/rc.d 
/etc/rc.d/init.d 
/etc/rc[0-6].d 
/etc/rc.d/rc[0-6].d 

в chkconfig спец-файл.Однако для пакета initscripts требуется /sbin/chkconfig, который предоставляется пакетом chkconfig. Из-за этой зависимости chkconfig является фактическим владельцем каталога.

+1

Это не тот случай, когда только один пакет может владеть ею. Например, из https://en.opensuse.org/openSUSE:Specfile_guidelines#Ownership: «В этом случае каждый пакет должен иметь каталог/usr/share/Foo/Animal.» Я вижу аналогичный пример в руководстве по упаковке Fedora. –

+0

Документация может вводить в заблуждение. Программа rpm может рассказать вам, что делает rpm *. Если вы обнаружите два одновременно установленных rpms, для которых 'rpm -ql' перечисляет один и тот же путь, то это то, что можно обсудить. –

+0

Итак, вы говорите, что два набора документов для двух из самых больших дистрибутивов ошибочны? Они даже дают отдельные примеры. Я дал сообщение от OpenSUSE; вот Fedora: «Решение. Оба пакета git и bzr должны иметь каталог /etc/bash_completion.d». Это означает, что в разделе% files файла .spec файла отображается общий каталог с директивой% dir (а затем без% dir подкаталоги в нем, которыми он владеет исключительно). –

1

Это зависит, особенно если пакеты для program1 и program2 построены из одного источника или образуют совершенно разные источники.

Если они происходят из одного источника, вы должны дифференцироваться в более изощренным способом:

%files program1 
%dir /usr/lib/mysystem 
/usr/lib/mysystem/program1 

%files program2 
%dir /usr/lib/mysystem 
/usr/lib/mysystem/program2 

Если строить их по отдельности, вы можете просто сделать

%files programX 
/usr/lib/mysystem 

, если вы работаете с clean buildroot, который, тем не менее, содержит только файлы, созданные вашим пакетом.

Но это не помешает сделать

%files programX 
%dir /usr/lib/mysystem 
/usr/lib/mysystem/programX 

, а также.

Если у вас есть несколько таких пакетов, вы даже можете создать общий пакет, который владеет этим каталогом и который также предоставляет другие требования, если у вас есть такие. Тогда достаточно потребовать этот «родительский пакет», «пакет компании» или как вы хотите назвать его.

Тогда достаточно, чтобы сделать

Requires: mysystemcompanypackage 
... 
%files 
/usr/lib/mysystem/program1 
Смежные вопросы