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"
**更新:**您遇到的問題是
Buildroot:
規範文件中的標籤。在現代系統(也許包括你
Buildroot:
的系統)中,不再支持規範文件,現在它被忽略了。Fedora(從 F-10 開始)在規範中不需要 BuildRoot 標籤,如果定義了它,它將被忽略。
您可以通過向 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 將失敗,正如您所描述的……