zoukankan      html  css  js  c++  java
  • 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打包完毕。

    金无足赤,人无完人,若有文章什么问题欢迎各位批评指正,共同交流,共同进步。 另,人过留名,雁过留声,少侠觉得还行的话留下个赞吧!:)
  • 相关阅读:
    Hadoop作业提交多种方案具体流程详解
    教你一步搭建Flume分布式日志系统
    Hadoop详细配置
    linux 运行springboot sqoop项目
    SQL+ 正则表达式
    SQL+ 正则表达式
    DB2中实现正则表达式
    DB2中实现正则表达式
    spring4整合cxf3
    spring4整合cxf3
  • 原文地址:https://www.cnblogs.com/thePeaceOftheLord/p/11011456.html
Copyright © 2011-2022 走看看