Centos

CentOS 7 - 在創建 RPM 包期間設置規範文件遇到的問題

  • February 6, 2019

我的目標是將 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 上的這篇文章

Fedora(從 F-10 開始)在規範中不需要 BuildRoot 標籤,如果定義了它,它將被忽略。

您可以通過向 rpmbuild 傳遞一個參數來解決此問題,--buildroot以便它使用/home/<package_dir>. (這可能會產生不利的副作用,例如在建構完成後刪除這些內容,這顯然也是現在的預設設置。)

事實上,傳遞 rpmbuild 和顯式--buildrootalien自 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 將失敗,正如您所描述的……

引用自:https://unix.stackexchange.com/questions/499045