Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1111251
  • 博文数量: 284
  • 博客积分: 8223
  • 博客等级: 中将
  • 技术积分: 3188
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 13:26
文章分类

全部博文(284)

文章存档

2012年(18)

2011年(33)

2010年(83)

2009年(147)

2008年(3)

分类:

2010-11-12 13:56:56

Linux安装包制作

Linux下制作安装程序有很多第三方工具,还有RPM包这种规范形式;然而要做很多适合项目要求的个性安装设置,还是自己动手用sh制作更合适。这种方法借鉴了其它一些产品的安装,增添了一些新的部分。也许有点笨,但用惯了觉得还算可以。

    这种作法基本道理是生成一个大的文件,由一段sh脚本加上一个tar包组成。sh脚本负责把tar包解开并完成一些必要操作,实现安装的拷贝和设置。这样一个大的文件加上执行权限就可以当安装程序使用,不得不佩服Linux的文件系统。

    制作这样的安装程序,一般需要这样的的发布结构:一个脚本文件负责解开安装文件中tar包,它也将作为安装文件的头部,在下面例子中是inst.sh;产品基本目录结构,包括可执行文件等,它将被tar成tar形式作为安装文件中数据部分,在下面例子中是product及其子目录;一个脚本用于把前两者合成安装文件,在下面例子中是mkinst.sh。

    下面举例说明:

     install/

     install/inst.sh

     install/mkinst.sh

     install/product/bin/start.tmpl

     install/product/bin/a.exe

     install/product/lib/libb.so.0.9

     install/product/work/product-inst.sh

     制作product的安装文件,要安装到用户指定路径,并且安装后start.sh执行a.exe时候调用libb.so.0.9。下面分步骤说明详细过程。

     1,inst.sh,内容如下。它将作为安装文件的控制部分,占据安装文件的头部。为了可重用,只让它做解开安装文件中tar包和清除临时文件、目录工作,具体安装控制语句调用'cd product/work'和'sh product-inst.sh'完成。细节处是'tail +49 $0 > data.tar',这是这个文件的行数加上1,可以用命令自动统计。

             #!/bin/sh

        ## 协议

        more <<"EOF"

                 License Agreement

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

        EOF

           ## 是否同意协议内容

        agreed=

        while [ x$agreed = x ]

        do

                    echo "Do you agree to the above license terms? [yes or no] "

                    read reply leftover

                    case $reply in

                y* | Y*)

                            agreed=1

                            ;;

                n* | N*)

                            echo "you can't install this sofware";

                            exit 1

                            ;;

                    esac

        done

        ## 从安装文件尾部取出tar包并在当前路径解开

        echo "Unpacking..."

        tail +49 $0 > data.tar

        tar xf data.tar 2>/dev/null

        if [ $? != 0 ]

        then

                    echo "There is error when unpacking files."

                    rm -rf data.tar product

                    exit 1

        fi

        echo "Done."

        ## 删除临时文件tar

        rm -f data.tar

        ## 执行具体安装操作

        cd product/work

        sh product-inst.sh

        cd ../..

        ## 删除临时目录

        rm -rf product

        exit 0

    2,product目录。这个目录中需要说明的是'install/product/bin/start.tmpl'和'install/product/work/product-inst.sh'文件。

    start.tmpl内容如下。其中@INSTALLPATH@是个变量,要根据用户输入置换。置换操作在product-inst.sh中完成,置换后生成真正的启动脚本start.sh。

        #!/bin/sh

       

        export LD_LIBRARY_PATH="@INSTALLPATH@/lib"

        "@INSTALLPATH@/bin/a.exe"

    product-inst.sh内容如下。它完成具体安装操作。

        #!/bin/sh

        ## 得到安装路径

        echo "set installing path:"

        read INPUT

        INST_PATH=$INPUT

        ## 置换start.tmpl中变量

        cat ../bin/start.tmpl | sed "s/@INSTALLPATH@/${INST_PATH}/"  >         ../bin/start.sh

        chmod +x ../bin/start.sh

        ## 复制文件到安装路径下

        mkdir -p "${INST_PATH}"

        mkdir -p "${INST_PATH}/bin"

        cp -R ../lib "${INST_PATH}"   

        cp ../bin/start.sh "${INST_PATH}/bin"

        cp ../bin/a.exe "${INST_PATH}/bin"   

    3,mkinst.sh,内容如下。

        #!/bin/sh

        tar cvf a.tar product

        cat inst.sh a.tar > product-setup.sh

        chmod +x product-setup.sh

        echo "success!"

        exit 0

    执行以上三个步骤,生成了product-setup.sh安装文件。这样product可以安装到任何地方。所有个性安装设置都可以在product-inst.sh中考虑用shell脚本实现。

阅读(4589) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~