rpm打包學習

1.RPM目錄結構

- rpmbuild
  - SOURCES    源碼、圖標等文件
  - SPECS      用于管理rpm制作進程的spec文件
  - BUILD      解壓后的文件
  - RPMS       由rpmbuild制作好的二進制包
  - SRPMS      由rpmbuild制作好的源碼包

2.spec文件綜述

  • spec文件有什么用?
  • spec文件有兩個用途:構建打包。構建即將源碼轉換為構建工件(java構建工具一般為Ant, Maven, Gradle; C語言構建工具為makefile)。打包即確定需要安裝在目標機器上的構建產物。

注意:#字符表示注釋,但需要避免注釋宏(以 % 開頭),因為它們會首先被替換展開。使用 %% 注釋宏。另外,還要避免在腳本命令的相同行中使用行內注釋。

%{name}%{version}%{release} 代表 Name, Version 和 Release 這三個標簽。只要更改標簽,宏就會使用新值。

spec文件主要標簽:

  1. Name: 軟件包名,應與 SPEC 文件名一致。

  2. Version: 版本號。

  3. Release: 發行編號,初始值為 1%{?dist} ,每次制作新包時,遞增該數字。

    • 什么是 1%{?dist} : 如果%{dist}未定義返回1,否則返回1%{dist},
    • 用法:
      1. if判斷:
        if 0%{?flag}; then
            foo
        fi
        
        如果%{flag}被定義了,條件語句為:0%{flag},執行if block; 反之,條件語句為:0, 不執行if block。
        注意:%{?flag}前必須加0,否則如果%{?flag}未定義,if語句停止執行并退出。
      2. %{?flag: ...}:如果%{flag}被定義,則展開"..."部分;
  4. Patch0: 用于源碼的補丁名稱。如果需要在源碼包解壓后對一些代碼做修改,應該修改代碼并使用 diff 命令生成 patch 文件,然后放在 ~/rpmbuild/SOURCES 目錄下。一個 Patch 應該只做一種修改,所以可能會包含多個 patch 文件。

  5. BuildRoot: 在 %install 階段(%build 階段后)文件需要安裝至此位置。默認情況下,根目錄為 %{_topdir}/BUILDROOT/

  6. %description: 程序的詳細/多行描述。每行必須小于等于 80 個字符。

  7. %prep: 打包準備階段執行一些命令(如,解壓源碼包,打補丁等),以便開始編譯。

  8. %build: 包含構建階段執行的命令,構建完成后便開始后續安裝。

  9. %install: 包含安裝階段執行的命令。命令將文件從 %{_builddir} 目錄安裝至 %{buildroot} 目錄。可以使用 $RPM_BUILD_ROOT 代替 %{buildroot},兩者都可以使用。

    術語:

    • %{_builddir}(即"build目錄"),與 %{buildroot}(即"build root目錄")是不同的目錄。在%{_builddir}中進行編譯,并將需要打包的文件從%{_builddir}中復制到%{buildroot}中。
    • %install階段的命令不會在用戶安裝RPM包時執行,此階段只在打包時執行。
      一般在%install階段執行make install之類的命令。%make_install命令等同于 DESTDIR=%{buildroot} ,該命令會將文件安裝到%{buildroot}目錄中。如果程序不支持 DESTDIR ,可手動執行安裝:需要在%{buildroot}下創建必要的目錄,并從%{_builddir}復制文件至%{buildroot}目錄。
  10. %clean: 清理安裝目錄。一般只包含:rm -rf %{buildroot}

  11. %files: %files指令列出需要安裝的文件和目錄。

    • %defattr 用于設置默認文件權限,一般在%files開頭設置。格式為:

      %defattr(<文件權限>, <用戶>, <用戶組>, <目錄權限>)
      

      常規用法為:

      %defattr(-, user, group, -) 
      
    • 必須在 %files 部分列出該軟件所擁有的所有文件,注意不要使用如 /usr/bin/ 的硬編碼,盡量使用宏代替目錄名。

    • 如果路徑以"/"開頭(或從宏擴展),則認為文件在%{buildroot}目錄中。否則,默認文件在當前目錄中。
      【問題:如果軟件包僅安裝一個文件,那么該文件會安裝在哪里?】
      【答:必須有一個路徑】

    • 若要軟件包不受上游改動影響,可使用通配符匹配所有文件。
      【問題:不受上游改動影響是什么意思?】
      注意:%{somedir}/*不會聲明軟件包擁有%{somedir}目錄,而只包含其中的文件。如果列出一個目錄,則該軟件包擁有整個目錄,以及該目錄內所有的文件和子目錄,因此要小心處理可能和其他軟件共享的目錄。

    • 如果存在以下情況,可能引發錯誤:

      • 通配符未匹配任何文件或目錄
      • 文件或目錄被多次列出
      • %{buildroot}中有文件未列出(空文件目錄不會報錯)
      • 使用通配符來列出全部文件時,可使用 %exclude 來排除文件。注意如果未匹配到任何文件也會造成失敗。

3. %files指令

%files列表包括多種指令,主要用于:

  • 識別文檔和配置文件
  • 確定文件有正確的權限和擁有組
  • 設置哪些文件需要在打包驗證時進行校驗
  • 精簡語法

兩個%files指令可同時作用于同一個文件,例如:%foo %bar baz

I 文件相關指令

RPM需要根據文件類型分別處理不同類型的文件,然而,rpm并沒有自動識別文件類型的功能。因此,需要由打包者適當的對不同類型的文件進行標識。
注意:并非所有文件都需要被標識,在大多數包中,大多數文件都不需要被標識。

  1. %doc 指令:
    rpm會跟蹤其數據庫中的文檔文件,以便用戶查找已安裝包信息。
    此外,rpm可在安裝期間創建包的文檔目錄,并將文檔復制其中。添加該步驟方法如下:
    %doc README
    %doc /usr/local/foo/README
    
    build期間,README 文件位于頂級目錄;軟件包install完成后,rpm將在軟件包同名的文檔目錄(即<software>-<version>-<release>)創建目錄,并將 README 文件拷貝其中。新創建的目錄和 README 文件將在rpm數據庫被作為文檔進行標識。默認的文檔目錄是/usr/doc,可在rpmrc文件中更改。
  2. %config 指令:用于標識文件作為配置文件。(只能一個配置文件)
  3. %attr 指令:用于設置文件權限。例:
    %attr(<file_mode>, <user>, <group>) filename 
    
  4. %defattr 指令: 用于設置文件默認權限,一般寫在%files頭部。例:
    %defattr(<file_mode>, <user>, <group>, <dir_mode>)
    
  5. %ghost to be continue...
  6. %verify to be continue...

II 目錄相關指令

  1. %docdir 指令:向文檔目錄列表添加目錄。rpm的%docdir列表默的認目錄有:/usr/doc, /usr/info, /usr/main。例:

    %docfir /usr/test ,
    

    任何/usr/test目錄下的文件都會自動被標識為文檔文件。

  2. %dir 指令:之前提到,如果在%files下列出文件夾,則該文件夾下的所有文件或子文件夾都會被打包到軟件包中。%dir指令可設置rpm只打包自身,而忽略其中的文件或子文件夾。

  3. -f <file>:從<file>中讀取%files列表。


Tips

  1. shell腳本錯誤 Syntax error near unexpected token `fi`:缺少 then
  2. spec文件內的標簽必須有值,標簽前不能有空格;
  3. spec文件必須要有%description
  4. spec文件的當前目錄為/BUILD
  5. %{buildroot}%install階段,/BUILDROOT下自動創建的子目錄/name-version-release
  6. %{buildroot}內的所有文件都必須在%files中列出,空目錄可不必列出
  7. /BUILDROOT目錄會在%install階段自動創建

代碼參考

package.sh:

CUR_DIR=$(cd `dirname $0`; pwd)

if [ -d ${CUR_DIR}/rpmbuild ]; then
    rm -rf ${CUR_DIR}/rpmbuild
fi
mkdir -p ${CUR_DIR}/rpmbuild
mkdir -p ${CUR_DIR}/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
cp  ${CUR_DIR}/*.spec   ${CUR_DIR}/rpmbuild/SPECS/
rpmbuild --define "_topdir ${CUR_DIR}/rpmbuild" -bb ${CUR_DIR}/rpmbuild/SPECS/web.spec

web.spec:

Name:           web
Version:        1.0.0
Release:        1%{?dist}
Summary:        test
License:        GPL
URL:            http://gitlabsec.huawei.com/h00416865/web

%description

%define PROJECT_ROOT %{_builddir}/../../..

%prep

%build
echo "begin to mvn install..."
cd %{PROJECT_ROOT}/web_console
mvn clean install

%install
rm  -rf    %{buildroot}
mkdir   -p  %{buildroot}/opt/weiee
mkdir   -p  %{_builddir}/webapp
cp  -r  %{PROJECT_ROOT}/web_console/target/*.war    %{_builddir}
unzip   -oq %{_builddir}/*.war  -d  %{_builddir}/webapp
cp  -r  %{_builddir}/webapp     %{buildroot}/opt/weiee

%files
%defattr(-,root,root,-)
/opt/weiee/

%post

%clean
rm -rf %{buildroot}

%changelog

參考文章

http://ftp.rpm.org/max-rpm/index.html
How to create an RPM package/zh-cn

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容