Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1381928
  • 博文数量: 247
  • 博客积分: 10147
  • 博客等级: 上将
  • 技术积分: 2776
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-24 15:18
文章分类

全部博文(247)

文章存档

2013年(11)

2012年(3)

2011年(20)

2010年(35)

2009年(91)

2008年(87)

我的朋友

分类:

2010-03-23 10:45:59

我写的一篇技术文档,和大家分享一下。
   
    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脚本实现。
阅读(4079) | 评论(0) | 转发(0) |
0

上一篇:ORACLE中文排序[转]

下一篇:基本命令 lsof

给主人留下些什么吧!~~