我的目标是将 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"
更新:您遇到的问题是
Buildroot:
规范文件中的标签。在现代系统(也许包括你
Buildroot:
的系统)中,不再支持规范文件,现在它被忽略了。请参阅LinuxQuestions 上的这篇文章:
您可以通过向 rpmbuild 传递一个参数来解决此问题,
--buildroot
以便它使用/home/<package_dir>
. (这可能会产生不利的副作用,例如在构建完成后删除这些内容,这显然也是现在的默认设置。)事实上,传递 rpmbuild 和显式
--buildroot
是alien
自 rpm 4.7.0 开始 ignoring 以来开始做的事情Buildroot:
,正如您在这个 commit中看到的那样。specfile 并没有真正安装任何源或创建任何文件。
该部分中唯一发生的事情
%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 将失败,正如您所描述的......