分类:
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脚本实现。 |