CentOS 7 - 在创建 RPM 包期间设置规范文件时遇到问题

CentOS 7 - 在创建 RPM 包期间设置规范文件时遇到问题

我的目标是将 Debian 软件包转换为 RPM 软件包,以将其安装在 CentOS Linux 7 (Red Hat) 上。我用外星人来完成它:alien --to-rpm --scripts --keep-version --generate debian_pkg.deb。我使用该--generate标志创建一个用于构建包的目录,因为我想将运行时依赖项添加到规范文件中。为此,我添加了这一行:Requires: nodejs tomcat8 java-1.8.0-openjdk java-1.8.0-openjdk-devel。然后我尝试创建 package: rpmbuild -ba <package_name>.spec,但它突然结束并出现以下错误:

Processing files: <package_name>
error: Directory not found: /root/rpmbuild/BUILDROOT/<package_name>/srv
error: Directory not found: /root/rpmbuild/BUILDROOT/<package_name>/srv/tmp
error: File not found: /root/rpmbuild/BUILDROOT/<package_name>/srv/tmp/file.tar.gz
error: File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/README.Debian
error: File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/changelog.Debian.gz
error: File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/copyright


RPM build errors:
    Directory not found: /root/rpmbuild/BUILDROOT/<package_name>/srv
    Directory not found: /root/rpmbuild/BUILDROOT/<package_name>/srv/tmp
    File not found: /root/rpmbuild/BUILDROOT/<package_name>/srv/tmp/file.tar.gz
    File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/README.Debian
    File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/changelog.Debian.gz
    File not found: /root/rpmbuild/BUILDROOT/<package_name>/usr/share/doc/frontend/copyright

我在互联网上搜索,发现它与该%install部分链接,更具体地说%{buildroot},但我无法解决这个问题并解决它。有人可以帮我吗?

谢谢!

更新

这是规范文件的本质:

Buildroot: /home/<package_dir>
Version: 1.0
Release: 849
Distribution: Debian
Group: Converted/misc
Requires: nodejs tomcat8 java-1.8.0-openjdk java-1.8.0-openjdk-devel

%define _rpmdir ../
%define _rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
%define _unpackaged_files_terminate_build 0

%pre
# some shell script

%post
# some shell script

%install
mkdir -p %{buildroot}/usr/share/doc/
mkdir -p %{buildroot}/usr/share/doc/frontend/

%files
%dir "/srv/"
%dir "/srv/tmp/"
"/srv/tmp/file.tar.gz"
%dir "/usr/"
%dir "/usr/share/"
%dir "/usr/share/doc/"
%dir "/usr/share/doc/frontend/"
"/usr/share/doc/frontend/README.Debian"
"/usr/share/doc/frontend/changelog.Debian.gz"
"/usr/share/doc/frontend/copyright"

答案1

更新:您遇到的问题是Buildroot:规范文件中的标签。

在现代系统(也许包括您的系统)中,Buildroot:规范文件不再受支持,并且现在已被忽略。

这篇关于 Linux 问题的文章关于那个:

Fedora(从 F-10 开始)不要求规范中存在 BuildRoot 标记,如果定义了该标记,它将被忽略。

您可以通过向 rpmbuild 传递一个参数来解决此问题,--buildroot以便它使用/home/<package_dir>. (这可能会产生不利的副作用,例如在构建完成后删除这些内容,这显然也是现在的默认设置。)

事实上,自 rpm 4.7.0 开始忽略以来,传递 rpmbuild 和explicit--buildroot就是开始做的事情,如您所见alienBuildroot:这次提交


规范文件并没有真正安装任何源或创建任何文件。

该部分中唯一发生的事情%install是创建一个(空)/usr/share/doc/frontend/目录。

由于specfile以指定开始Buildroot: /home/<package_dir>,我想它期望之前填充该目录,以便rpmbuild步骤能够简单地从那里获取已经暂存的内容并打包它们。

如果您alien再次从同一个 .deb 运行(换句话说,重新开始),您是否会得到一个/home/<package_dir>填充有 eg 的文件srv/tmp/file.tar.gz?如果是这样,那么当您此时运行 rpmbuild 时,它就会起作用。

在构建 rpm 后,您的 rpmbuild 中的某些宏可能会被清理%{buildroot}(尽管我想说这很不寻常,因为通常需要%clean在您的规范文件中包含一个部分。)检查是否是这种情况,如果是在第一个(成功的)rpmbuild 之后,下面的文件/home/<package_dir>消失了,在这种情况下,进一步运行 rpmbuild 将失败,正如您所描述的......

相关内容