Centos和Ubuntu下打包項目


樓主新手一枚,在打包過程中踩了無數坑才打包成功,還不乏自己給自己挖的坑,其中艱辛不必多說,雖然網上教程眾多,但可以將過程清楚描述給我這樣新手的並不多,而且其中好多坑也都沒有指出,今我把我所做的過程記錄下來,一來分享給大家,二來以背日后還用。

過程參考https://www.cnblogs.com/lvdongjie/p/4187189.html。

Centos下打包

一.源代碼包

主要就是將項目打成壓縮包,但有以下注意事項:

1.刪除版本管理目錄,比如.svn,.git等目錄。避免源代碼包過大,同時也是為了避免.svn中的個人信息泄露。

2.刪除二進制中間文件,即.o文件。主要為避免源文件過大。

3.添加config腳本或者makefile配置文件。兩個文件都是為了讓用戶能夠編譯,用戶可以運行config腳本生成makefile文件,在通過make命令生成可執行文件。如果沒有config文件,就需要手寫或自動生成一份makefile文件,手寫的話,需要將全部源文件寫入其中,同時對不太熟悉它的人不友好,所以,我用了Qt自帶的qmake工具自動生成了makefile文件,用qmake生成makefile需要有.pro文件,.pro文件可以手寫也可以自動生成,因為樓主下的項目中自帶了.pro文件,所以並沒有深究.pro文件的具體內容和生成命令,因為遲早要用到,所以先留個坑,看過之后回來填上。

4.修改編譯目標從debug版本到release版本。這一般意味着 CFLAGS 要改成 -O2 而不是 -g;VS 一般意味着將目標從 debug 轉為 release。這樣用戶生成的可執行程序才能足夠小和足夠快。

5. 添加知識產權信息,就是授權協議。小程序大家一般都不在乎,但如果是您在這個項目上花了足夠的心血,還是最好選擇一個自己喜歡的授權協議。可以將協議聲明放在每個源文件的最前注釋中,也可以在項目的根目錄下放一個 license 文件。

6.壓縮成tar.gz 或者 .tar.bz2 格式。

tips:

  makefile文件主要用來說明如何編譯各個源文件並連接生成可執行文件,並指定源文件之間的依賴關系。編寫完makefile后,執行make命令,就可以自動將項目編譯連接出可執行文件。

二.rpm包

在這里我們用rpmbuild工具來打rpm包。

1.在當前用戶目錄下創建rpmbuild目錄

命令為:mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

其中各目錄的用途如下:

 

BUILD  解壓源代碼包和構建軟件    
BUILDROOT 保存 %install 階段安裝的文件
RPMS 最終生成的可安裝二進制rpm包的所在目錄
SOURCES 所有源代碼和補丁文件的存放目錄
SPECS 存放rpm包配置文件(.spec文件)的目錄
SRPMS 源碼格式rpm(srpm)存放路徑 

        
   
         
     
         
       

 

2.將准備好的源代碼包放在SOURCES目錄下

3.在SPECS下編寫.spec控制文件

在該文件中有很重要的一點,buildroot目錄為虛擬根目錄,在此目錄下建的目錄就是文件想要安裝的位置

%define  path /home/admin/Weather   #定義名為path,內容為/home/admin/Weather 的變量

Name:           weather           #軟件名稱
Version:        1.0              #版本號
Release:        1%{?dist}          #發布序列號
Summary:        WEATHER Client     #軟件概要
Group:          Network          #軟件類別,可按標准分組進行分組
License:        GPL           #軟件授權協議
URL:            http://www.cnblogs.com/u/thePeaceOftheLord/     #軟件主頁
Source0:        weather-1.0.tar.gz                 #軟件源代碼包名稱,可以有多個,例如Source1,Source2

%description        #軟件描述
No description

%prep            #預處理,在此行下,可以添加有關預處理的命令
%setup -q           #宏,將源代碼tar包解壓到BUILD目錄下

%build           #編譯構建,在此行之下,添加有關編譯的命令

%configure    


%install            #安裝,在此行之下可以添加有關安裝的命令
make install DESTDIR=%{buildroot}                        #安裝到buildroot目錄下

mkdir $RPM_BUILD_ROOT%{path}                        #注意,此處在buildroot目錄下新建了 /home/admin/Weather 目錄
cp $RPM_BUILD_DIR/%{name}-%{version}/filename $RPM_BUILD_ROOT%{path}   #注意,這一步 將build目錄下需要打包的東西復制到了剛才在buildroot下新建的目錄下

#注意,以上兩行就定義了生成的rpm包在安裝時的路徑,會安裝到 /home/admin/Weather目錄下,這里為方便理解只建了一個目錄,當你有多個文件需要放在不同目錄下時,還可以建立多個目錄,然后分別從build目錄下復制過來就行。

%files        #所有需要被打包進去的文件,寫的是buildroot目錄下的相對路徑

%{path}          #在buildroot下需要打包的文件路徑,同時,該路徑也是安裝rpm包時的路徑
%doc

%changelog      #更改日志

2019.6.25更新

*******************************************

#下面的幾步pre、post、preun、postun 提供了安裝或卸載時的其他操作

%pre                  #rpm安裝前制行的腳本

%post                #安裝后執行的腳本

%preun             #卸載前執行的腳本

%postun           #卸載后執行的腳本

%clean             #清理段,刪除buildroot rm -rf %{buildroot}

*******************************************

 

tips:

  有的項目沒有config文件,就可以不用寫%configure和下邊的命令,寫了會報找不到./configure的錯

這篇文章寫的很到位,大家可以看看,

這篇文章也是講.spec文件的,講的也不錯,https://www.jianshu.com/p/fb72b85dfac8

 

問題:自定義路徑后報錯,ERROR: No build ID note found in xxxxx

 define區添加以下這行

 %define debug_package %{nil}      #(親測有效)

 參考:https://forums.fedoraforum.org/showthread.php?182293-RPM-Build-Error

 添加之后還是不行,出現新的問題:error: Arch dependent binaries in noarch package

 注釋掉 BuildArch: noarch 或者添加  %_binaries_in_noarch_packages_terminate_build 0

 參考:https://stackoverflow.com/questions/21288374/shipping-so-and-binaries-while-building-rpm-package

 

還有一點,當有多個source時,怎么辦

經過測試,在.spec添加一個壓縮source文件,然后在pre預編譯階段,用setup -n sourcename 解決不了,用tar解壓到build下也執行不了,最后解決方法,不把source壓縮,直接在pre階段cp過去,還有一種解決方法,直接把所有的文件都壓縮在同一文件夾內,直接解壓,在pre,build階段不進行操作,直接在build階段cp過去。(如果你有更好的辦法,可以寫在評論中,大家共同進步)

 

4.打包

rpmbuild -ba path  #path是.spec文件路徑

在運行最后出現exit 0表示生成成功

運行結束后,會在RPMS文件下生成可安裝的rpm文件

 

問題:執行rpmbuild命令報錯找不到指定目錄或文件

檢查一下.spec文件中的%install宏下創建目錄,復制文件是否錯誤。

 

5.安裝測試

rpm -ivh ~/rpmbuild/RPMS/x86_64/weather-1.0-1.el7.x86_64.rpm    #安裝剛才打包好的安裝包
rpm -ql weather                                                 #查找安裝路徑
rpm -qi weather                                                 #查詢安裝應用相關信息

 

問題:安裝時缺少依賴

 

三種解決方式:

 

第一種:上網上找相關依賴包,並下載安裝

 

第二種:讓其自行解決依賴(沒有測試過)

 

    加上--aid,例如: rpm -ivh --aid  path/xxx.rpm 

 

第三種:忽略它,或強制安裝

 

    加上 --nodeps,意思不考慮依賴,例如: rpm -ivh  --nodeps path/xxx.rpm

 

    加上--force,強制安裝,例如: rpm -ivh --force path/xxx.rpm

 

 

 

至此,centos下打包完成。

 


 

ubuntu下打包

現在說一下debian系的ubuntu下怎么打包,發現debian系下還是比較容易打包的,相較於redhat系,debian系免去了配置文件的麻煩,只需要簡單說明軟件的一些基本信息就行,甚是容易。

1.將源文件編譯

debian打包只是打包,不提供編譯功能,所以還需要自己編譯。編譯過程應該和上文所述的源碼包編譯一致。

2.整理打包所需文件

  1)創建一個空目錄

  在某目錄下,例如我是在/home/lym下建立一個目錄,work,現在目錄為/home/lym/work

  2)指定安裝路徑

  然后將需要打包的文件復制到該目錄下,這里有很重要的一點,work這個目錄就是一個"假根目錄",您在這個目錄下所有的修改,最后都會被映射到目標機的根目錄 / 下,比如說在該目錄下(/home/lym/work)我建立了一個usr/bin這樣的目錄,然后將我項目中的可執行文件放到usr/bin目錄下(/home/lym/work/usr/bin/xxx),當打完包安裝的時候,這個可執行文件就會被安裝到/usr/bin目錄下(注意,這里是絕對路徑),同理,想讓庫文件安裝到/usr/lib目錄下,就得在當前目錄(/home/lym/work)下建立usr/lib目錄,然后將庫文件放到其下(/home/lym/work/usr/lib/xxx)。

  3)配置文件

  在work目錄下建立一個名為DEBIAN的目錄,在其下有兩個文件,一個是control,另一個是md5sums,前一個是必須的,其中主要包含軟件基本信息和維護者信息,后者是軟件的md5校驗值,可以有可以沒有。

 

2019.6.25更新

 

*******************************************

 

除了有control和md5sums文件外,還可以有還可能有preinst(preinstallation)(安裝之前執行腳本)、postinst(postinstallation)(安裝之后執行的腳本)、prerm(preremove)(卸載之前執行腳本)、postrm(postremove)(卸載之后執行的腳本)、copyright (版權)、changlog (修訂記錄)和conffiles等文件。

 

*******************************************

 

  創建control命令:gedit DEBIAN/control,其中配置文件的內容比較簡單不再解釋。

  生成md5sums:   md5sum . > /home/lym/work/DEBIAN/md5sums  #生成當前目錄下所有文件的md5校驗值,因為md5sum不能遞歸生成文件md5值,所以暫時只能挨個目錄生成

3.打包

  命令:   dpkg -b /home/lym/work /home/lym/xxx.deb  #將work目錄下的內容打包到/home/lym下,xxx.deb為打包出來的deb文件。

4.安裝卸載

  安裝: dpkg -i xxx.deb

  卸載: dpkg -r xxx

 

至此,DEBIAN系下的ubuntu打包完畢。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM