【问题标题】:What is the minimum I have to do to create an RPM file?创建 RPM 文件我必须做的最低限度是什么?
【发布时间】:2010-10-27 04:26:06
【问题描述】:

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

不幸的是,documentation for RPM 有 27 章,我真的没有时间坐下来阅读,因为我还忙于为其他平台制作 .deb 和 EXE 安装程序。

创建 RPM 所需的绝对最低限度是多少?假设 foobar 二进制文件和 foobar.conf 在当前工作目录中。

【问题讨论】:

标签: rpm rpmbuild


【解决方案1】:

如需快速构建 RPM,请查看 Togo:

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 目录中。

【讨论】:

  • 更新了示例以匹配原始问题中提供的场景。
【解决方案2】:

作为应用程序分发者,fpm sounds perfect for your needsan example here 展示了如何从源代码打包应用程序。 FPM 可以生成 deb 文件和 RPM 文件。

【讨论】:

  • 我们在工作中一直使用这个工具。迄今为止满足需求的最实用的工具。
  • FPM 有一个可以在软件中得到的最好的基本原则:如果它没有帮助,那就是一个错误。这是我珍惜的承诺。
【解决方案3】:

从二进制构建 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 的更多详细信息,请查看link

GUI java软件搭建rpm:https://sourceforge.net/projects/javarpmbuilder/

【讨论】:

    【解决方案4】:

    我经常在 Linux 上为每个打包专有应用程序(也最像 websphere)执行二进制 rpm。 所以我的经验对你也很有用,除了如果可以的话,最好做一个真正的 RPM。但我离题了。

    因此,打包(二进制)程序的基本步骤如下 - 我想在其中 程序是 1.0 版的 toybinprog,在 /etc/toybinprog/toybinprog.conf 中安装了一个 conf,并在 /usr/bin 中安装了一个名为 tobinprog 的 bin:

    1。为 RPM 创建你的 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
    

    仅此而已。

    希望有帮助

    【讨论】:

    • 以防万一您遇到“rpmbuild: command not found”,请参阅wiki.centos.org/HowTos/SetupRpmBuildEnvironment。但是本指南是我学习 rpm 内部工作原理的良好开端
    • 在您的示例中,_bindir 是由什么设置的?我正在尝试遵循您的解决方案,但我想将我的二进制文件放入 /opt。我据此创建了 targz 文件。并且 rpmbuild 在 buildroot/usr/bin 中“找不到文件”失败。
    • sudo dnf install rpm-build -- Fedora 23 命令安装 rpmbuild v4.13+
    • @devzero2000 TRUE RPM 是什么意思?
    • @devzero2000 rpmbuild 文件夹应该在 /root 目录或者我可以把它放在别的地方?
    【解决方案5】:

    从源文件生成RPM的过程:

    1. 下载扩展名为.gz 的源文件。
    2. 从 yum install 安装 rpm-build 和 rpmdevtools。 (将生成 rpmbuild 文件夹...SPECS、SOURCES、RPMS.. 文件夹将在 rpmbuild 文件夹内生成)。
    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. 配置成功后运行以下命令: 制作
    7. 成功执行 od make 命令后运行: 检查安装 在同一个文件夹中。 (如果您没有 checkinstall 软件,请从网站下载最新版本) checkinstall软件也有bug,可以通过以下方式解决::::: 找到 checkinstallrc,然后使用 vim 命令将 TRANSLATE = 1 替换为 TRANSLATE=0。 还要检查排除包:EXCLUDE="/selinux"
    8. checkinstall 将询问选项(如果您想为源文件构建 rpm,请输入 R)
    9. 已完成的 .rpm 文件将在 rpmbuild/RPMS 文件内的 RPMS 文件夹中构建... 万事如意....

    【讨论】:

      【解决方案6】:

      如果您熟悉 Maven,还有 rpm-maven-plugin 可以简化 RPM 的制作:您只需编写 pom.xml 即可用于构建 RPM。 RPM 构建环境由插件隐式创建。

      【讨论】:

        【解决方案7】:

        同样,我需要创建一个只包含几个文件的 rpm。由于这些文件是源代码控制的,而且看起来很傻,我不想为了让 rpm 解压它们而对它们进行去皮重处理。我想出了以下几点:

        1. 设置您的环境:

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

          echo '%_topdir %(echo "$HOME")/rpm' &gt; ~/.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
        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

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

          您需要编写包含如何配置和编译应用程序的规范文件;还有,哪些文件要包含在您的 RPM 中。

          快速浏览一下手册就会发现,第 8 章涵盖了您需要的大部分内容——此外,由于大多数基于 RPM 的发行版都有可用的源代码,因此您可以查看大量不同方法的示例。

          【讨论】:

            猜你喜欢
            • 2020-06-12
            • 2013-04-02
            • 2021-08-16
            • 2020-11-18
            • 2011-01-16
            • 1970-01-01
            • 1970-01-01
            • 2023-04-07
            • 2012-11-21
            相关资源
            最近更新 更多