Centos和Ubuntu下打包项目

Posted thepeaceofthelord

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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      #更改日志

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校验值,可以有可以没有。

  创建contol命令: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打包完毕。

 

以上是关于Centos和Ubuntu下打包项目的主要内容,如果未能解决你的问题,请参考以下文章

CentOS7/8系统下,使用Jenkins实现SpringBoot+Vue前后端分离项目持续集成,一键编译打包跨设备部署,完整详细教学演示

CentOS7/8系统下,使用Jenkins实现SpringBoot+Vue前后端分离项目持续集成,一键编译打包跨设备部署,完整详细教学演示

CentOS7/8系统下,使用Jenkins实现SpringBoot+Vue前后端分离项目持续集成,一键编译打包跨设备部署,完整详细教学演示

使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS

ubuntu下使用pyinstaller将python文件打包成exe(py文件中含有keras框架的代码)

Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序