20 年來我沒有從頭開始建造 RPM。所以我們可以有效地說「從不」。
[編輯] RPM 的要求是提供回溯、版本控制等。這是沒有商量餘地的。
我需要安裝一個二進位檔案和一個設定檔。我認為需要對用戶帳戶和目錄進行一些設置,這應該是簡單的。
如果我想在 RPM 建置過程中進行經過測試的可重現構建,我必須複製我們的 CI 管道步驟。不平凡。理想情況下,我可以從其他位置提取所需的文件:
%prep
cp ${somefile} ${another file} $RPM_SOURCE_DIR
%setup
:
這可能嗎?或者我錯過了一些明顯的解決方案。
謝謝。
答案1
從我的角度來看,這在某種程度上取決於您的具體目標:
像Fedora 這樣的Linux 發行版實際上期望他們的發行版構建是使用規範文件從源代碼構建的軟體(在一個密封的構建系統中,該系統還記錄了用於構建的包/組件),並認為這是一個很好的實踐,也可以獲得盡可能多的可重複性盡可能。
但是,您確實可以提取預先建置的二進位檔案並在規範檔案中使用它們來建立 RPM 包,這是您場景的簡化範例:
# […]
Source0: <binary file>
Source1: <config file>
# […]
%prep
%setup -q -c -T
%build
%install
install -D -p -m 0755 %{SOURCE0} $RPM_BUILD_ROOT%{_bindir}/%{name}
install -D -p -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}.conf
# […]
雖然這可能有效,但您應該明確檢查產生的 RPM 套件的依賴項是否適當 ( rpm -qp --requires <…>.rpm
) 或是否缺少執行時間依賴項。在建置 RPM 套件時,通常會有編譯時選項或參數(例如CFLAGS
,LDFLAGS
以 C 編寫的軟體)以及後處理腳本(例如/usr/lib/rpm/(redhat/)brp-*
,為您新增特定發行版的內容和/或擷取執行時間依賴項)。這可能與您相關,也可能不相關(某些後處理腳本也可能適用於預先建置的二進位文件,但其他腳本由於缺乏編譯器選項而不適用於)。雖然我打包了很多軟體,但我對 Haskell 沒有經驗,但是在查看某些 Fedora 軟體包時,發現有些 RPM 軟體包具有運行時依賴項(如果存在運行時依賴項,則必須透過以下方式來滿足) RPM 軟體包,因為這就是RPM 的工作方式;並且在檔案系統上的某個位置擁有匹配的庫是不夠的,因為RPM 不會知道它,除非它是由RPM 軟體包提供的。因此,從預先建置的二進位檔案建置 RPM 套件可能會導致 RPM 套件沒有適當的依賴項,這可能會在以後顯示為執行時間錯誤。
關於上面的範例:雖然SourceX:
可以給定 URL,但在建立 RPM 套件時rpmbuild
仍然期望這些檔案位於磁碟上的目錄中SOURCES
(因此它們如何進入目錄SOURCES
取決於您)。
鑑於您沒有提及您的目標 Linux 發行版,我將連結 Fedora 的Haskell 包裝指南 在這裡,這可能會也可能不會提供進一步的靈感。是的,RPM 軟體包可以跨發行版,這實際上通常會導致 RPM 軟體包內出現靜態二進位文件,因為不同 Linux 發行版上的庫/軟體包版本通常不同。