Какой минимум я должен сделать, чтобы создать файл RPM?


148

Я просто хочу создать RPM-файл для распространения моего бинарного Linux-файла "foobar", имеющего только пару зависимостей. Он имеет конфигурационный файл /etc/foobar.conf и должен быть установлен в / usr / bin / foobar.

К сожалению, документация для RPM состоит из 27 глав, и у меня действительно нет времени сидеть и читать это, потому что я также занят созданием установщиков .deb и EXE для других платформ.

Какой абсолютный минимум я должен сделать, чтобы создать RPM? Предположим, что двоичный файл foobar и foobar.conf находятся в текущем рабочем каталоге.


1
« Как создать пакет RPM » - это хорошая
статья

6
Назвать это «рецензией» - преуменьшение
kernelK

Ответы:


177

Я часто делаю двоичные обороты в минуту для пакетов проприетарных приложений - в том числе и веб-сферы - в Linux. Так что мой опыт может быть полезен и вам, кроме того, что было бы лучше сделать ИСТИННЫЕ обороты, если вы можете. Но я отвлекся.

Итак, основной шаг для упаковки вашей (бинарной) программы заключается в следующем: я предполагаю, что программа - toybinprog с версией 1.0, имеет файл conf, устанавливаемый в /etc/toybinprog/toybinprog.conf, и пакет bin для установки. в / usr / bin называется tobinprog:

1. Создайте свой RPM build env для RPM <4.6,4.7

mkdir -p ~/rpmbuild/{RPMS,SRPMS,BUILD,SOURCES,SPECS,tmp}

cat <<EOF >~/.rpmmacros
%_topdir   %(echo $HOME)/rpmbuild
%_tmppath  %{_topdir}/tmp
EOF

cd ~/rpmbuild

2. создать тарбол вашего проекта

mkdir toybinprog-1.0
mkdir -p toybinprog-1.0/usr/bin
mkdir -p toybinprog-1.0/etc/toybinprog
install -m 755 toybinprog toybinprog-1.0/usr/bin
install -m 644 toybinprog.conf toybinprog-1.0/etc/toybinprog/

tar -zcvf toybinprog-1.0.tar.gz toybinprog-1.0/

3. Скопировать в источник dir

cp toybinprog-1.0.tar.gz SOURCES/

cat <<EOF > SPECS/toybinprog.spec
# Don't try fancy stuff like debuginfo, which is useless on binary-only
# packages. Don't strip binary too
# Be sure buildpolicy set to do nothing
%define        __spec_install_post %{nil}
%define          debug_package %{nil}
%define        __os_install_post %{_dbpath}/brp-compress

Summary: A very simple toy bin rpm package
Name: toybinprog
Version: 1.0
Release: 1
License: GPL+
Group: Development/Tools
SOURCE0 : %{name}-%{version}.tar.gz
URL: http://toybinprog.company.com/

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

%description
%{summary}

%prep
%setup -q

%build
# Empty section.

%install
rm -rf %{buildroot}
mkdir -p  %{buildroot}

# in builddir
cp -a * %{buildroot}


%clean
rm -rf %{buildroot}


%files
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf
%{_bindir}/*

%changelog
* Thu Apr 24 2009  Elia Pinto <devzero2000@rpm5.org> 1.0-1
- First Build

EOF

4. построить исходный и двоичный rpm

rpmbuild -ba SPECS/toybinprog.spec

И это все.

Надеюсь это поможет


6
Если вы столкнулись с «rpmbuild: команда не найдена», см. Wiki.centos.org/HowTos/SetupRpmBuildEnvironment . Но это руководство - хорошее начало для меня, чтобы изучить внутреннюю работу rpm
icasimpan

4
В вашем примере, что устанавливает _bindir? Я пытаюсь следовать вашему решению, но я хотел бы поместить мои двоичные файлы в / opt. Я создал файл targz в соответствии с этим. И rpmbuild завершается с ошибкой «файл не найден» в buildroot / usr / bin.
Поцелуй Викторию

sudo dnf install rpm-build- Команда Fedora 23 для установки rpmbuild v4.13 +
Рэй Фосс

1
@ devzero2000 Что вы подразумеваете под ИСТИННЫМИ об / мин?
Рубен Лагуна

@ devzero2000 папка rpmbuild должна находиться в / root каталоге, или я мог бы разместить ее где-нибудь еще?
Диого Калазанс

20

Как дистрибьютор приложений, fpm звучит идеально для ваших нужд . Здесь есть пример, который показывает, как упаковать приложение из исходного кода. FPM может создавать как файлы deb, так и файлы RPM.


2
FPM - это потрясающий инструмент.
Такаши

Мы используем этот инструмент все время на работе. Безусловно, самый практичный инструмент для удовлетворения потребностей.
djhaskin987

2
У FPM есть лучший фундаментальный принцип, который можно найти в программном обеспечении: если это не помогает, есть ошибка. Это то обязательство, которое я лелею.
Рибамар

16

Для быстрого создания RPM, проверьте Того:

https://github.com/genereese/togo-rpm

В проекте есть краткое руководство, и мне удалось создать базовый RPM менее чем за 3 минуты.

Пример с использованием данных, приведенных в исходном вопросе:

1) Создайте каталог проекта, используя скрипт:

$ togo project create foobar; cd foobar

2) Создайте нужную структуру каталогов в ./root и скопируйте в нее свои файлы:

$ mkdir -p root/etc; cp /path/to/foobar.conf root/etc/
$ mkdir -p root/usr/bin; cp /path/to/foobar root/usr/bin/

3) Исключить системные каталоги из собственности вашего RPM:

$ togo file exclude root/etc root/usr/bin

4) (НЕОБЯЗАТЕЛЬНО) Измените сгенерированную спецификацию, чтобы изменить описание вашего пакета / зависимости / версию / что угодно, и т.д .:

$ vi spec/header

5) Постройте RPM:

$ togo build package

-и ваш RPM выплевывается в каталог ./rpms.


Обновлен пример, чтобы соответствовать сценарию, представленному в исходном вопросе.
dadealeus

15

Точно так же мне нужно было создать rpm всего с несколькими файлами. Так как эти файлы контролировались исходным кодом, и потому что это казалось глупым, я не хотел разбираться с ними, просто чтобы rpm распаковывал их. Я придумал следующее:

  1. Настройте свою среду:

    mkdir -p ~/rpm/{BUILD,RPMS}

    echo '%_topdir %(echo "$HOME")/rpm' > ~/.rpmmacros

  2. Создайте свой файл спецификаций foobar.spec со следующим содержимым:

    Summary: Foo to the Bar
    Name: foobar
    Version: 0.1
    Release: 1
    Group: Foo/Bar
    License: FooBarPL
    Source: %{expand:%%(pwd)}
    BuildRoot: %{_topdir}/BUILD/%{name}-%{version}-%{release}
    
    %description
    %{summary}
    
    %prep
    rm -rf $RPM_BUILD_ROOT
    mkdir -p $RPM_BUILD_ROOT/usr/bin
    mkdir -p $RPM_BUILD_ROOT/etc
    cd $RPM_BUILD_ROOT
    cp %{SOURCEURL0}/foobar ./usr/bin/
    cp %{SOURCEURL0}/foobar.conf ./etc/
    
    %clean
    rm -r -f "$RPM_BUILD_ROOT"
    
    %files
    %defattr(644,root,root)
    %config(noreplace) %{_sysconfdir}/foobar.conf
    %defattr(755,root,root)
    %{_bindir}/foobar
    
  3. Создайте свой RPM: rpmbuild -bb foobar.spec

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

Примечание: в моей конкретной ситуации мои файлы были расположены в папках в соответствии с тем, куда они должны идти, например:

./etc/foobar.conf
./usr/bin/foobar

и поэтому раздел подготовки стал:

%prep
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT
cd $RPM_BUILD_ROOT
tar -cC %{SOURCEURL0} --exclude 'foobar.spec' -f - ./ | tar xf -

Который немного чище.

Кроме того, я нахожусь на RHEL5.6 с версиями 4.4.2.3 об / мин, поэтому ваш пробег может отличаться.


Мне пришлось повернуть все, $RPM_BUILD_ROOTчтобы %{buildroot}заставить его работать на моем "Red Hat Enterprise Linux Server версии 6.9". Кроме того, два файла, которые были установлены, должны были находиться в текущем каталоге, когда я запускал rpmbuild. Я установил его на другой машине с: sudo rpm -Uvh --nodeps foobar-0.1a-1.x86_64.rpm
user1683793

4

Если make configработает для вашей программы или у вас есть сценарий оболочки, который копирует ваши два файла в соответствующее место, вы можете использовать checkinstall . Просто перейдите в каталог, где находится ваш make-файл, и вызовите его с параметром -R(для RPM ) и, при необходимости, с помощью сценария установки.


4

Простой способ собрать пакет rpm из двоичного файла (эти шаги были протестированы в Fedora 18):

1) Сначала вы должны установить rpmdevtools, поэтому выполните эти команды (внимание: запускайте как обычный пользователь)

$ sudo yum install rpmdevtools rpmlint
$ rpmdev-setuptree

2) В папке ~ / rpmbuild / SPECS создайте новый файл: имя_пакета.spec

3) Откройте его с помощью редактора (например, gedit) и напишите:

Name:           package_name
Version:        1.0
Release:        1
Summary:        Short description (first char has to be uppercase)

License:        GPL
URL:            www. your_website/

BuildRequires:  package_required >= (or ==, or <=) 1.0.3 (for example)

%description
Description with almost 79 characters (first char has to be uppercase)

#This is a comment (just as example)

%files
/usr/bin/binary_file.bin
/usr/share/applications/package_name.desktop
/usr/share/pixmaps/package_name.png

%changelog
* date Packager's Name <packager's_email> version-revision
- Summary of changes

#For more details see: docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/Packagers_Guide/sect-Packagers_Guide-Creating_a_Basic_Spec_File.html

4) Создайте ~ / rpmbuild / BUILDROOT / package_name-version-release.i386 и воспроизведите пути, в которые будут помещены файлы. Так, в этом случае, например, создайте:

  • ~ / Rpmbuild / Buildroot / package_name-версия-release.i386 / USR / бен /
  • ~ / Rpmbuild / Buildroot / package_name-версия-release.i386 / USR / доли / приложений /
  • ~ / Rpmbuild / Buildroot / package_name-версия-release.i386 / USR / доли / растровые изображения /

5) Поместите в эти папки файлы, которые вы хотите вставить в пакет:

  • ~ / Rpmbuild / Buildroot / package_name-версия-release.i386 / USR / бен / binary_file.bin
  • ~ / Rpmbuild / Buildroot / package_name-версия-release.i386 / USR / доли / приложений / package_name.desktop
  • ~ / Rpmbuild / Buildroot / package_name-версия-release.i386 / USR / доли / растровые изображения / package_name.png

usr / share / pixmaps / package_name.png - это значок бинарного файла usr / share / Applications / package_name.desktop - это правила для вставки программы в пункты меню.

6) имя_пакета.desktop должно быть таким:

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=example
GenericName=Short description
Comment=Comment of the application
Exec=package_name
Icon=package_name
Terminal=false
Categories=System;

Категории таковы: standard.freedesktop.org/menu-spec/latest/apa.html

7) Беги $ rpmbuild -bb ~/rpmbuild/SPECS/package_name.spec

8) Ваш пакет был встроен в папку ~ / rpmbuild / RPMS

если вы устанавливаете этот пакет, он устанавливает:

  • /usr/bin/binary_file.bin
  • /usr/share/applications/package_name.desktop
  • /usr/share/pixmaps/package_name.png

Спасибо: losurs.org/docs/tips/redhat/binary-rpms

Для получения более подробной информации о сборке RPM взгляните на эту ссылку .

Java-программное обеспечение с графическим интерфейсом для сборки rpm: https://sourceforge.net/projects/javarpmbuilder/


-1

Если вы знакомы с Maven, это также rpm-maven-pluginупрощает создание RPM: вам нужно написать только то, pom.xmlчто затем будет использовано для создания RPM. Среда сборки RPM создается неявно плагином.


-3

Процесс генерации RPM из исходного файла:

  1. скачать исходный файл с расширением .gz
  2. установить rpm-build и rpmdevtools из yum install. (будет создана папка rpmbuild ... внутри папки rpmbuild должны быть созданы папки SPECS, SOURCES, RPMS ..).
  3. скопируйте исходный код.gz в папку SOURCES. (rpmbuild / SOURCES)
  4. Распакуйте тарный шарик, используя следующую команду. перейдите в папку SOURCES: rpmbuild / SOURCES, где находится tar-файл. команда: например, tar -xvzf httpd-2.22.tar.gz Папка httpd-2.22 будет сгенерирована по тому же пути.
  5. перейдите в извлеченную папку и введите следующую команду: ./configure --prefix = / usr / local / apache2 --with-enabled-apr --enable-proxy --enable-proxy-balancer --with-mpm = worker - -enable-mods-static = all (.configure может варьироваться в зависимости от источника, для которого должен быть построен RPM - я сделал для apache HTTPD, которому требуется пакет зависимостей apr и apr-util).
  6. выполните команду ниже, как только конфигурация будет успешной: make
  7. после успешного выполнения выполните команду make: checkinstall в той же папке. (если у вас нет программного обеспечения checkinstall, скачайте последнюю версию с сайта). Также в программном обеспечении checkinstall есть ошибка, которая может быть устранена следующим образом :::: найдите checkinstallrc и затем замените TRANSLATE = 1 на TRANSLATE = 0 с помощью команды vim. Также проверьте исключение пакета: EXCLUDE = "/ selinux"
  8. checkinstall запросит опцию (введите R, если вы хотите tp build rpm для исходного файла)
  9. Готово .rpm файл будет встроен в папку RPMS внутри файла rpmbuild / RPMS ... ВСЕ ЛУЧШЕЕ ....

-4

RPM обычно создаются из исходного кода, а не из двоичных файлов.

Вам нужно написать спецификационный файл, который описывает, как настроить и скомпилировать ваше приложение; также, какие файлы включить в ваш RPM.

Беглый взгляд на руководство показывает, что большая часть того, что вам нужно, описана в Главе 8, а также, поскольку большинство дистрибутивов на основе RPM имеют доступные источники, существует буквально миллион примеров различных подходов, на которые вы могли бы взглянуть.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.