创建RPM文件的最低要求是什么?


148

我只想创建一个RPM文件来分发我的Linux二进制文件“ foobar”,它只有几个依赖项。它有一个配置文件/etc/foobar.conf,应该安装在/ usr / bin / foobar中。

不幸的是,RPM文档长达 27章,我真的没有一天可以坐下来阅读本文,因为我还忙于为其他平台制作.deb和EXE安装程序。

创建RPM的绝对最低要求是多少?假设foobar二进制文件和foobar.conf位于当前工作目录中。


1
如何创建RPM包 ”是RPM的不错的文章(Fedora文档)
webwesen

6
轻描淡写地
称其为“报道

Answers:


177

我经常在Linux上对每个打包的专有应用程序(也更像是Websphere)执行二进制rpm。因此,我的经验对您也可能有用,此外,如果可以的话,最好执行TRUE RPM。但是我离题了。

因此,打包(二进制)程序的基本步骤如下-我假设程序是1.0版的toybinprog,在/etc/toybinprog/toybinprog.conf中安装conf,并安装bin。在/ usr / bin中称为tobinprog:

1.为RPM <4.6,4.7创建rpm构建环境

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.复制到源目录

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。但是,本指南是在学习转的内部工作的良好开端。我
icasimpan

4
在您的示例中,设置_bindir的原因是什么?我正在尝试遵循您的解决方案,但我想将二进制文件放入/ opt。我根据此创建了targz文件。rpmbuild在buildroot / usr / bin中的“找不到文件”上失败。
2014年

sudo dnf install rpm-build-用于安装rpmbuild v4.13 +的Fedora 23命令
Ray Foss

1
@ devzero2000 TRUE RPM是什么意思?
RubenLaguna

@ devzero2000 rpmbuild文件夹应位于/ root目录,否则我可以将其放置在其他地方?
Diogo Calazans

20

作为应用程序分发者,fpm听起来很满足您的需求。这里有一个示例,显示了如何从源代码打包应用程序。FPM可以同时生成deb文件和RPM文件。


2
FPM是一个很棒的工具。
2013年

我们一直在工作中使用此工具。迄今为止,最实用的工具可以满足需求。
djhaskin987 2013年

2
FPM具有可以在软件中获得的最佳基本原理:如果没有帮助,则存在错误。我很珍惜这种承诺。
ribamar

16

要快速构建RPM,请查看多哥:

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

该项目有一个快速入门指南,我能够在不到3分钟的时间内创建基本的RPM。

使用原始问题中提供的数据的示例:

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

那里有一个小小的黑客,将“源”指定为当前目录,但它看起来比替代方案优雅得多,就我而言,替代方案是编写一个单独的脚本来创建tarball等。

注意:在我的特殊情况下,我的文件根据需要放置的位置排列在文件夹中,如下所示:

./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,rpm版本为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 '18

4

如果make config适用于您的程序,或者您具有将两个文件复制到适当位置的Shell脚本,则可以使用checkinstall。只需转到您的makefile所在的目录,并使用参数-R(对于RPM)和安装脚本(可选)进行调用。


4

从二进制文件构建rpm软件包的简单方法(这些步骤已通过Fedora 18进行了测试):

1)首先,您必须安装rpmdevtools,因此请运行以下命令(注意:以普通用户身份运行)

$ sudo yum install rpmdevtools rpmlint
$ rpmdev-setuptree

2)在〜/ rpmbuild / SPECS文件夹中,创建新文件:package_name.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-version-release.i386 / usr / bin /
  • 〜/ rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / share / applications /
  • 〜/ rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / share / pixmaps /

5)将要插入文件的文件放在这些文件夹中:

  • 〜/ rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / bin / binary_file.bin
  • 〜/ rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / share / applications / package_name.desktop
  • 〜/ rpmbuild / BUILDROOT / package_name-version-release.i386 / usr / share / pixmaps / package_name.png

usr / share / pixmaps / package_name.png是二进制文件usr / share / applications / package_name.desktop是将程序插入菜单项的规则

6)package_name.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;

这些类别是:standards.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的更多详细信息,请查看此链接

用于构建rpm的GUI Java软件:https : //sourceforge.net/projects/javarpmbuilder/


-1

如果您熟悉Maven,那么这也会rpm-maven-plugin简化RPM的制作:您只需要编写pom.xml将用于构建RPM的代码即可。RPM构建环境是由插件隐式创建的。


-3

从源文件生成RPM的过程:

  1. 使用.gz扩展名下载源文件。
  2. 从yum install安装rpm-build和rpmdevtools。(将生成rpmbuild文件夹...应该在rpmbuild文件夹内生成SPECS,SOURCES,RPMS ..文件夹)。
  3. 将源代码.gz复制到SOURCES文件夹。(rpmbuild / SOURCES)
  4. 使用以下命令解开tar球。转到存在tar文件的SOURCES文件夹:rpmbuild / SOURCES。命令:例如tar -xvzf httpd-2.22.tar.gz httpd-2.22文件夹将在同一路径中生成。
  5. 转到解压缩的文件夹,然后键入以下命令:./configure --prefix = / usr / local / apache2 --with-included-apr --enable-proxy --enable-proxy-balancer --with-mpm = worker- -enable-mods-static = all(.configure可能根据要构建RPM的来源而有所不同-我已经为需要apr和apr-util依赖包的apache HTTPD做过此操作)。
  6. 配置成功后,运行以下命令:make
  7. 成功执行od make命令后,请执行以下操作:在同一文件夹中检查安装。(如果您没有checkinstall软件,请从站点下载最新版本。)checkinstall软件也存在可以通过以下方式解决的错误:::::找到checkinstallrc,然后使用vim命令将TRANSLATE = 1替换为TRANSLATE = 0。还要检查排除包:EXCLUDE =“ / selinux”
  8. checkinstall将询问选项(如果您要为源文件使用tp build rpm,请输入R)
  9. 完成的.rpm文件将建立在rpmbuild / RPMS文件内的RPMS文件夹中...最好的....

-4

RPM通常是从源而不是二进制文件构建的。

您需要编写说明文件,其中涵盖了如何配置和编译应用程序。另外,您的RPM中要包含哪些文件。

快速浏览手册会发现,您所需的大部分内容已在第8章中介绍了-而且,由于大多数基于RPM的发行版都有可用的资源,因此您可以看的无数种不同方法的示例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.