Linux系统下安装包制作



Linux系统下安装包制作


 

转载自:http://blog.sina.com.cn/s/blog_6f83fdb40101ic17.html


本文以OpenDDS开源代码为例,编写Linuxbin安装包制作流程及详细代码,将已经搭建好的DDS环境打包制作成bin安装包,在目标Linux系统上,直接安装(免予多次编译),即可使用。

前提是有一个已经搭建好的OpenDDS环境,关于Linux系统下DDS编译方法请参考前一博文:LinuxOpenDDS环境搭建

bin安装包的制作思想:

将安装脚本install.sh和源码包打成一个bin文件,当在命令行运行bin安装文件时,其实就是运行bin里面的install.sh来解压bin中的tar.gz的过程。

安装脚本install.sh和打包脚本auto_package.sh的具体代码如下:

1install.sh,内容如下:

#!/bin/bash

PATH=/usr/bin:/bin

 

ProductName="OpenDDS"

ProductVer="3.5"

AppFolder="/usr"

InstallPath=

 

TAR_NAME="$ProductName$ProductVer.tar.gz"

 

#打印许可

function printLicense() {

    more <<"EOF"

     

      License Agreement

    .............

EOF

 

read -p "Do you agree to the above license terms? [y/n]:" reply leftpver

case $reply in

    y* | Y*)

          echo "You have agreed to the license, install start...";;

      n* | N*)

          echo "You don't agreed to the license, you can't install $ProductName$ProductVer."

           exit 1;;

      *)

           echo "Invalid select, exit install ."

           exit 1;;

      esac

}

 

#版本号比较

function VersionComp() {

    if [ "$1" = "$2" ]; then

          echo "eq"

      else

          lrel=`printf "%s\n%s\n" $1 $2 | \

               sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n | \

                 head -1`

           if [ "$1" = "${lrel}" ]; then

               echo "lt"

           else

               echo "gt"

           fi

      fi

}

 

#软件版本号检测

function VersionCheck() {

    DDS_ROOT=${DDS_ROOT}

      VersionFile=$DDS_ROOT/VERSION

      if [ -e $VersionFile ]; then

          Version=`head -1 $VersionFile | awk '{print $5}' | cut -d"," -f1`

           if [ "gt" = $(VersionComp "$Version" "$ProductVer") ]; then

               echo "Newer version ($Version) is already installed, please uninstall first!"

                 exit 1

           else

               read -p "Older version ($Version) is already installed, upgrade to $ProductVer? [y/n]:" reply leftover

                 case $reply in

                y* | Y*)

                          ;;

                      n* | N*)

                         echo "You don't agreed to the license, you can't install $ProductName$ProductVer."

                            exit 1;;

                      *)

                         echo "Invalid select, exit install ."

                       exit 1;;

              esac

           fi

      fi

}

 

#设置安装路径

function SetInstallPath() {

    read -p "Install $ProductName$ProductVer to $AppFolder, sure? [y/n]:" reply leftover

      case $reply in

    y* | Y*)

          ;;

      n* | N*)

          read -p "Please input install path: " AppFolder leftover;;

      *)

          

echo "Invalid select, exit install ."

           exit 1;;

      esac

     

      AppFolder=`readlink -f $AppFolder`

      InstallPath=$AppFolder/

      mkdir -p $InstallPath

}

 

#文件校验

function CheckSum() {

    if [ ! -x /usr/bin/sum ]; then

          echo "Can't find /usr/bin/sum to do checksum, continuing anyway."

           return 0

      fi

 

      echo "Checksumming..."

      sumret=(`/usr/bin/sum $TAR_NAME`)

      if [ ${sumret[0]} != sum_value -o ${sumret[1]} != sum_size ]; then

          echo "The install file appears to be corrupted."

        echo "Please do not attempt to install this file."

           exit 1;

      fi

}

 

#解包

function Unpack() {

    echo "Unpacking..."

      lines=`awk '/^exit 0/print NR+1;exit 1;}' "$0"`

      tail -n +$lines "$0" > $TAR_NAME      2>/dev/null

     

      CheckSum

     

      tar -zvxf $TAR_NAME -C $InstallPath/  2>/dev/null

     

      rm $TAR_NAME

}

 

#写环境变量

function WriteEnv() {

    echo "

export DDS_ROOT=$InstallPath/$ProductName$ProductVer/DDS

export PATH=\$DDS_ROOT/bin:\$PATH

export LD_LIBRARY_PATH=\$DDS_ROOT/lib:\$LD_LIBRARY_PATH

" >> ~/.bashrc

    echo "Please restart, to make environment variable effect."

}

 

VersionCheck

printLicense

SetInstallPath

Unpack

WriteEnv

 

echo "Install complete!"

exit 0

 

2auto_package.sh,内容如下:

#!/bin/bash

PATH=/usr/bin:/bin

 

ProductName="OpenDDS"

ProductVer="3.5"

 

DDS_ROOT=${DDS_ROOT}

DDS_SRC="$ProductName$ProductVer/"

 

#拷贝源码目录构建安装目录

rm    -rf $DDS_SRC

mkdir -p  $DDS_SRC

cp    -r  $DDS_ROOT $DDS_SRC

 

#删除多余的文件和目录

find  ./  -name *.sln             -exec rm -r {} \;

find  ./  -name *vcproj*          -exec rm -r {} \;

find  ./  -name *vcxproj*         -exec rm -r {} \;

find  ./  -name .obj      -type d -exec rm -r {} \;

find  ./  -name .shobj    -type d -exec rm -r {} \;

 

TAR_NAME="$ProductName$ProductVer.tar.gz"

Release="$ProductName$ProductVer.bin"

 

#将安装文件打成tar

rm $TAR_NAME $Release

tar -zcvf $TAR_NAME $DDS_SRC

 

#计算文件校验值并写到安装脚本中

dds_sum=(`/usr/bin/sum $TAR_NAME`)

sum_value=${dds_sum[0]}

sum_size=${dds_sum[1]}

 

cat install.sh | sed -e s/sum_value/$sum_value/ -e s/sum_size/$sum_size/ > temp.bin

 

#将安装脚本和目标文件一起打成bin文件

cat temp.bin $TAR_NAME > $Release

chmod a+x $Release

 

rm -rf $DDS_SRC $TAR_NAME temp.bin

 

3、执行打包脚本:

将第一步和第二步创建的两个脚本文件放在同一目录下,执行auto_packet.sh脚本,就可以自动创建一个OpenDDSbin安装包了,将打好的安装包OpenDDS3.5.bin拷贝到目标机上,使用./OpenDDS3.5.bin命令即可启动安装。

 

关于Linux系统下bin安装包制作的原理性解释请参考:http://www.cnblogs.com/itech/archive/2010/02/01/1661248.html

<think>我们已经掌握了用户需求:在Linux系统制作安装包的方法或工具根据引用资料,提取关键信息:[^1]提到apt-get是基于Debian系统的包管理工具,使用deb包格式[^2]提到CentOS/Fedora使用yum安装rpm-build和rpmdevtools工具来创建RPM包[^3][^4][^5]都指向同一个工具:makeself,用于制作一键安装的run包用户问题:如何在Linux下创建安装包或使用什么工具制作Linux安装包需要整理出不同场景下的解决方案:1.制作deb包(适用于Debian/Ubuntu)2.制作rpm包(适用于CentOS/Fedora)3.制作跨平台的一键安装包(run格式)步骤:1.介绍不同包格式适用的系统2.分别说明制作方法3.提供简单示例尤其要注意引用资料中提到的工具:-deb包:使用dpkg-buildpackage或直接构建-rpm包:使用rpmbuild(需要安装rpm-build)-一键安装包:使用makeself另外,引用[5]中提供了一个shell脚本制作run包的方法,也可以作为备选方案。结构化回答:1.开头说明Linux下常见的安装包格式及对应的制作工具2.分三部分详细说明:deb包制作、rpm包制作、run包制作3.每种方法给出基本步骤和示例4.最后总结建议注意事项:-根据引用资料,run包制作有两种方式:使用makeself工具或自己编写脚本-要标注引用来源考虑到用户可能需要命令行操作,适当提供代码块。</think> 在 Linux 系统下创建安装包主要有三类主流方法,不同方法适用于不同场景(桌面应用、系统工具、跨平台脚本等),以下是具体实现指南: ### 一、Deb 格式安装包(Ubuntu/Debian 系) 适用于系统级软件分发,使用官方工具链: ```bash # 安装构建工具 sudo apt install build-essential dh-make # 创建包结构 mkdir myapp-1.0 && cd myapp-1.0 dh_make --native --single # 编辑控制文件 nano debian/control # 填写包名/依赖/描述 nano debian/rules # 配置编译规则 # 构建安装包 dpkg-buildpackage -us -uc ``` 生成文件:`../myapp_1.0_amd64.deb` > 特点:支持依赖管理、版本控制,通过`apt install ./package.deb`安装 [^1] ### 二、RPM 格式安装包(CentOS/RHEL 系) 通过 rpmbuild 工具链实现: ```bash # 安装开发套件 sudo yum install rpm-build rpmdevtools # 初始化工作目录 rpmdev-setuptree cd ~/rpmbuild/SPECS rpmdev-newspec myapp.spec # 编辑 spec 文件(关键字段) Name: myapp Version: 1.0 Release: 1%{?dist} Install: mkdir -p %{buildroot}/usr/bin && cp myapp %{buildroot}/usr/bin/ # 构建 RPM rpmbuild -bb myapp.spec ``` 生成路径:`~/rpmbuild/RPMS/x86_64/myapp-1.0-1.el7.x86_64.rpm` [^2] ### 三、跨平台一键安装包(.run 格式) #### 方案 A:使用 Makeself 工具 ```bash # 下载安装 makeself wget https://github.com/megastep/makeself/releases/download/release-2.4.0/makeself-2.4.0.run chmod 755 makeself-2.4.0.run ./makeself-2.4.0.run # 创建安装包 makeself ./app_dir my_installer.run "应用描述" ./install_script.sh ``` 安装脚本模板 `install_script.sh`: ```bash #!/bin/bash echo "正在解压文件..." tar xzf ./resources.tar.gz -C /opt/myapp/ echo "安装完成!" ``` #### 方案 B:手动 Shell 脚本封装 ```bash #!/bin/bash LINES=8 # 脚本总行数+1 TAIL_CMD="tail -n +$LINES $0" # 主安装逻辑 $TAIL_CMD > ./temp.tar.gz tar zxvf ./temp.tar.gz cp -r myapp /usr/local/bin/ rm temp.tar.gz exit 0 # 此处附加压缩包二进制数据(用 cat 命令合并) ``` 生成命令:`cat header.sh app.tar.gz > installer.run` [^3][^4][^5] --- ### 选择建议 1. **系统级软件**:优先选择 deb/rpm,兼容系统包管理 2. **绿色软件/脚本工具**:.run 格式更灵活 3. **超简单分发**:直接打包为 tar.gz + 安装脚本 > 特殊场景:Snap/Flatpak 适用于沙盒应用,Docker 镜像适合容器化部署
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值