一个合格的产品必须要有一个像样的安装包,每次拷来拷去显得太不上档次,哈哈。。。也不便于用户使用。

闲话不多扯,直奔主题,看过来吧,程序猿(媛)们:本文主要介绍二进制安装包的创建和使用:


1.首先介绍二进制安装包的结构:

1)最终生成的二进制安装包的名称为:Project.run

2)用于生成安装包的准备文件结构如下:

./mkinst.sh
./inst.sh
./Project-V1.0.tar.gz/Product-V1.0/work/product-inst.sh
./Project-V1.0.tar.gz/Product-V1.0/ProductV1.0/Product
./Project-V1.0.tar.gz/Product-V1.0/ProductV1.0/plugins/ProductPlugins
./Project-V1.0.tar.gz/Product-V1.0/ProductV1.0/ICON.png
 
./Project-V1.0.tar.gz/Product-V1.0/ProductV1.0/Product.desktop


2.下面将针对上面的文件进行一一介绍

1)mkinst.sh用于生成二进制安装包的文件

源码如下:


#!/bin/sh
cat inst.sh Product-V1.0.tar.gz > Product.run
chmod +x Product.run
echo "success!"
exit 0



注释:cat inst.sh Product-V1.0.tar.gz > Product.run将inst.sh和Product-V1.0.tar.gz文件连接并生成一个新的二进制文件Product.run文件

2)inst.sh产品个性化安装文件的头文件

源码如下:

#!/bin/bash


## 协议
more <<"EOF"
License Agreement:This install method can just be used by personal.
EOF

## 是否同意协议内容
agreed=1
while [ $agreed -eq 1 ]
do

	read -p "    Do you agree to the abolve license terms?[yes or no]:" reply leftover
	case $reply in
	y* | Y*)
		break
		;;
	n* | N*)
		echo "you can't install this software";
		exit 1
		;;
	esac
done

## 从安装文件Product.run尾部取出tar包并在当前路径解开
rm -rf /tmp/ProductCache
mkdir /tmp/ProductCache
lines=51
tail -n+$lines $0>/tmp/ProductCache/Product-V1.0.tar.gz
cd /tmp/ProductCache
tar -xzvf "Product-V1.0.tar.gz" > /dev/null
if [ $? -ne 0 ]
then
	echo "There is error when unpacking files."
	rm -rf "Product-V1.0.tar.gz"
	exit 1
fi

## 删除临时文件tar
rm -rf "Product-V1.0.tar.gz"

## 执行具体安装操作
cd "Product-V1.0/work"
sh product-inst.sh
cd ../..
## 删除临时目录
rm -rf Product-V1.0
exit 0



注释:


lines=51inst.sh文件本身有50行

tail -n+$lines $0>/tmp/ProductCache/Product-V1.0.tar.gz从第51行开始到本文件的末尾的内容保存为新的文件(Product.run中前50行为inst.sh文件的内容;从第51行开始的所有数据属于Product-V1.0.tar.gz)

 

3)product-inst.sh产品个性化安装文件

源码如下:


#!/bin/sh

## 得到安装路径(由用户进行输入)
read -p "set installing path[eg./home/lf/example]:" INPUT
INST_PATH=$INPUT

## 安装路径不存在,则创建
if [ ! -x "$INST_PATH" ]
then
	mkdir -p "${INST_PATH}"
fi

##产品已安装其他版本,是否卸载并升级
if [ -x "$ProductFile" ]
then
	read -p "There exists an older version in this system. Whether to upgrade?[yes or not]:" rep  leftover
	case $rep in
	y* | Y*)
		rm -rf "$ProductFile"
		;;
	n* | N*)
		echo "fail to install."
		exit 1
		;;
	esac
fi

##为启动器(类似win下的快捷方式)设定启动本产品,并设定产品图标
echo "Exec=$INST_PATH/ProductV1.0/Product" >>../ProductV1.0/Product.desktop
echo "Icon=$INST_PATH/ProductV1.0/ICON.png" >>../ProductV1.0/Product.desktop

##产品安装到指定安装目录中,并赋予可执行权限
cp -R ../ProductV1.0 "${INST_PATH}"
cd "${INST_PATH}/ProductV1.0"
chmod 775 Product

##是否要在桌面创建产品启动器
deskPath1="/home/$USER/桌面"
deskPath2="/home/$USER/Desktop"
if [ -x "$deskPath1" ]
then
	read -p "Create a softlink in the folder:$deskPath1?[yes or no]:" reply leftover
	case $reply in
	y* | Y*)
		cp "Product.desktop" "$deskPath1"
		;;
	esac
else
	if [ -x "$deskPath2" ]
	then
		read -p "Create a softlink in the folder:$deskPath2?[yes or no]:" reply leftover
		case $reply in
		y* | Y*)
		cp "Product.desktop" "$deskPath2"
		;;
		esac
	fi
fi


## 注册系统环境变量(目的:以备产品检测升级)
sed -i '/ProductFile/d' /home/$USER/.bash_profile
echo "export ProductFile=$INST_PATH/ProductV1.0" >>/home/$USER/.bash_profile
echo "installed success,restart,please."



4)

./Project-V1.0.tar.gz/Product-V1.0/ProductV1.0/Product产品 
5)./Project-V1.0.tar.gz/Product-V1.0/ProductV1.0/plugins/ProductPlugins产品依赖的插件
6)./Project-V1.0.tar.gz/Product-V1.0/ProductV1.0/ICON.png产品图标文件


7)./Project-V1.0.tar.gz/Product-V1.0/ProductV1.0/Product.desktop 产品启动器(类似win下的快捷方式)

产品启动器的制作,请参加本博另一篇博客:Linux下桌面启动器(桌面配置文件)的创建

至此,一个二进制.run安装包即生成了。使用方法,启动终端运行命令:./Project.run 后按步骤进行即可;还有很多安装过程的个性化设置,都可以在produc-inst.sh文件中添加。

本文是用shell写的脚本文件,有朋友提醒可用python去写,可能会简单些。感兴趣的童鞋可以去了解下。。。欢迎交流。。。