Избегайте избыточности в файле спецификаций RPM

Я пытаюсь создать простой пакет noarch. Я создаю пакет с:

rpmbuild -bb --build-in-place --define "_topdir $(pwd)/rpm" typeset-pdf.spec

Это спецификация:

Name:       typeset-pdf
Version:    1.0
Release:    1%{?dist}
Summary:    Typeset PDF
License:    Proprietary
BuildArch:  noarch

%description
Use TeX templates to typeset PDF files.

%prep

%build

%install
install -D -t %{buildroot}/%{_bindir} %{name}
install -D -t %{buildroot}/%{_datadir}/%{name}/lieferschein \
        lieferschein/lieferschein.tex.tt \
        lieferschein/logo.eps

%files
%{_bindir}/%{name}
%{_datadir}/%{name}/lieferschein/lieferschein.tex.tt
%{_datadir}/%{name}/lieferschein/logo.eps

%changelog

Содержимое разделов %install и %files практически идентично. Можно ли избежать этой избыточности? Могу ли я как-нибудь использовать содержимое раздела %files в разделе %install?


person ceving    schedule 26.11.2020    source источник


Ответы (2)


Можно ли избежать этой избыточности

Да, делая что-то вроде (очень приблизительный код!):

%install
<your install commands>
find %{buildroot} > installed-files

%files -f installed-files

Но это деликатно, и вы столкнетесь с проблемами при упаковке /usr/bin/ и других системных каталогов.

Почему нет?

Я бы рекомендовал вам не избегать этих дубликатов. Вот как работает rpm, и это имеет свою ценность (особенно при создании нескольких пакетов с одним и тем же спецификационным файлом). Обратите внимание, что в разделе %install вам нужно создать /usr/bin/ и т. д., в то время как вы не должны не упаковывать их в раздел %files.

Также обратите внимание, что под %files вы можете указать каталог, который будет рекурсивно упаковывать каталог:

%files
%{_bindir}/%{name}
%{_datadir}/%{name}

в вашем случае будет достаточно.

Еще раз: обязательно упакуйте все файлы и каталоги, принадлежащие вашему пакету, но не более того. Каждый файл и каталог может принадлежать только одному rpm пакету. Например, если вы забудете упаковать свой верхний каталог, он останется лежать без дела, когда вы удалите файл rpm.

person Chris Maes    schedule 26.11.2020
comment
Пробовал реализовать решение, не должно. Я до сих пор не уверен, почему бы и нет. Я пытался избежать проблем, о которых вы упомянули. Можете посмотреть и объяснить, в каких случаях он все равно выйдет из строя? - person ceving; 26.11.2020

Вариант Cris Maes проголосовал против:

Name:       typeset-pdf
Version:    1.0
Release:    1%{?dist}
Summary:    Typeset PDF
License:    Proprietary
BuildArch:  noarch

%description
Use TeX templates to typeset PDF files.

%prep

%build

%install
> FILES
file ()
{
  install -m 0644 -D -t "%{buildroot}/$(dirname "$1/$2")" "$2"
  echo "$1/$2" >> FILES
}
dir ()
{
  mkdir -p -m 0755 "%{buildroot}/$1/$2"
  echo "%dir $1/$2" >> FILES
}
file %{_bindir}              typeset-pdf
dir  %{_datadir}             typeset-pdf
dir  %{_datadir}/typeset-pdf lieferschein
file %{_datadir}/typeset-pdf lieferschein/lieferschein.tex.tt
file %{_datadir}/typeset-pdf lieferschein/logo.eps

%files -f FILES

%changelog
person ceving    schedule 26.11.2020
comment
Вы пробовали установить это? Я думаю, у вас будут проблемы, потому что вы, вероятно, упаковочные каталоги, которые вам не следует делать. Ваш код зависит от количества подкаталогов, которые вы упаковываете. Это может сработать, и вы можете быть довольны этим, но для меня это сложнее, чем решение, которое я предложил. Просто попробуйте :) - person Chris Maes; 26.11.2020
comment
@ChrisMaes Ты прав. Он не очищал каталоги. - person ceving; 26.11.2020
comment
Обратите внимание, что вы можете использовать rpm -qlp <path-to-rpm-package> для запроса файлов и каталогов, упакованных внутри rpm. Это может ускорить отладку :) - person Chris Maes; 26.11.2020
comment
Необходимо различать файлы и каталоги. Я изменил это. - person ceving; 26.11.2020
comment
В конце концов вы получите то, что работает, но я настаиваю на том, что мое предложение было намного проще в коде и проще в обслуживании. - person Chris Maes; 26.11.2020