本文目录导读:

我来介绍几种用脚本生成简易安装包的方法,主要适用于Linux和macOS系统。
shell脚本安装包(最简单)
单文件shell脚本
#!/bin/bash
# install.sh - 简易安装脚本
# 版本信息
VERSION="1.0.0"
INSTALL_DIR="/usr/local/myapp"
# 检查是否为root用户
if [ "$EUID" -ne 0 ]; then
echo "请以root权限运行"
exit 1
fi
# 创建安装目录
mkdir -p $INSTALL_DIR
# 解压内嵌的二进制数据
echo "正在安装应用..."
# 将base64编码的文件解码
echo "Base64编码的文件内容..." | base64 -d > $INSTALL_DIR/myapp
# 设置执行权限
chmod +x $INSTALL_DIR/myapp
# 创建软链接
ln -sf $INSTALL_DIR/myapp /usr/local/bin/myapp
echo "安装完成!"
自解压脚本
#!/bin/bash
# self_extract.sh - 自解压安装脚本
# 设置标记行(文件数据开始的位置)
MARKER="__ARCHIVE_MARKER__"
# 检查文件完整性
if [ ! -f "$0" ]; then
echo "错误:无法找到自身"
exit 1
fi
echo "正在解压安装包..."
# 创建临时目录
TEMP_DIR=$(mktemp -d)
# 提取文件数据
ARCHIVE_START=$(grep -an "^${MARKER}$" "$0" | cut -d: -f1 | tail -1)
if [ -z "$ARCHIVE_START" ]; then
echo "错误:未找到安装数据"
exit 1
fi
# 从标记行后提取数据
tail -n +$((ARCHIVE_START + 1)) "$0" | tar -xzf - -C "$TEMP_DIR"
# 执行安装
cd "$TEMP_DIR"
./install.sh
# 清理
rm -rf "$TEMP_DIR"
echo "安装完成!"
exit 0
# 以下为压缩的文件数据
__ARCHIVE_MARKER__
makeself工具(推荐)
makeself 是一个专门创建自解压安装包的工具:
#!/bin/bash # 使用makeself创建安装包 # 1. 安装makeself # macOS: brew install makeself # 2. 准备文件结构 mkdir -p myapp_package cat > myapp_package/install.sh << 'EOF' #!/bin/bash echo "安装我的应用..." cp -rf ./* /usr/local/myapp/ echo "安装完成" EOF cat > myapp_package/myapp << 'EOF' #!/bin/bash echo "Hello, 这是我的应用!" EOF chmod +x myapp_package/install.sh myapp_package/myapp # 3. 创建自解压安装包 makeself myapp_package myapp_installer.run "我的应用安装程序" ./install.sh
Python脚本创建安装包
#!/usr/bin/env python3
# create_installer.py
import os
import tarfile
import base64
import shutil
import tempfile
def create_installer():
"""创建简易安装包"""
# 准备安装脚本
install_script = '''#!/bin/bash
echo "开始安装..."
# 解压文件
ARCHIVE_START=$(grep -an "^__DATA__$" "$0" | cut -d: -f1 | tail -1)
tail -n +$((ARCHIVE_START + 1)) "$0" | base64 -d | tar -xz
echo "安装完成!"
exit 0
__DATA__
'''
# 创建临时目录
with tempfile.TemporaryDirectory() as tmpdir:
# 创建需要打包的文件
os.makedirs(f"{tmpdir}/bin")
# 示例应用文件
with open(f"{tmpdir}/bin/myapp", 'w') as f:
f.write('#!/bin/bash\necho "我的应用"')
os.chmod(f"{tmpdir}/bin/myapp", 0o755)
# 打包文件
tar_path = f"{tmpdir}/package.tar.gz"
with tarfile.open(tar_path, "w:gz") as tar:
tar.add(f"{tmpdir}/bin", arcname="bin")
# 读取并编码
with open(tar_path, 'rb') as f:
data = base64.b64encode(f.read()).decode()
# 生成安装包
installer_path = "myapp_installer.sh"
with open(installer_path, 'w') as f:
f.write(install_script)
f.write(data)
os.chmod(installer_path, 0o755)
print(f"安装包已创建: {installer_path}")
if __name__ == "__main__":
create_installer()
高级版本:带交互功能的安装脚本
#!/bin/bash
# advanced_install.sh - 高级安装脚本
# 配置
APP_NAME="MyApp"
VERSION="1.0.0"
DEFAULT_INSTALL_DIR="/opt/${APP_NAME}"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
show_header() {
clear
echo -e "${GREEN}================================${NC}"
echo -e "${GREEN} ${APP_NAME} v${VERSION} 安装程序${NC}"
echo -e "${GREEN}================================${NC}"
echo ""
}
# 检查依赖
check_dependencies() {
echo "检查系统依赖..."
# 检查命令是否存在
commands=("curl" "wget" "tar")
for cmd in "${commands[@]}"; do
if ! command -v $cmd &> /dev/null; then
echo -e "${YELLOW}警告: $cmd 未安装${NC}"
fi
done
}
# 选择安装目录
select_install_dir() {
echo ""
echo "安装目录: [$DEFAULT_INSTALL_DIR]"
read -p "按回车确认或输入新路径: " user_input
INSTALL_DIR="${user_input:-$DEFAULT_INSTALL_DIR}"
if [ -d "$INSTALL_DIR" ]; then
echo -e "${YELLOW}警告: 目录已存在${NC}"
read -p "是否覆盖? (y/n): " overwrite
if [ "$overwrite" != "y" ]; then
exit 1
fi
fi
}
# 执行安装
perform_installation() {
echo ""
echo "开始安装..."
# 创建目录
mkdir -p "$INSTALL_DIR"
# 检查磁盘空间
AVAILABLE_SPACE=$(df "$INSTALL_DIR" | awk 'NR==2 {print $4}')
if [ "$AVAILABLE_SPACE" -lt 1024 ]; then
echo -e "${RED}错误: 磁盘空间不足${NC}"
exit 1
fi
# 解压文件(这里假设文件在脚本末尾)
echo "正在解压文件..."
ARCHIVE_START=$(grep -an "^__ARCHIVE__$" "$0" | cut -d: -f1 | tail -1)
if [ -n "$ARCHIVE_START" ]; then
tail -n +$((ARCHIVE_START + 1)) "$0" | tar -xzf - -C "$INSTALL_DIR"
fi
# 设置权限
chmod -R 755 "$INSTALL_DIR"
# 创建软链接
if [ -f "$INSTALL_DIR/bin/myapp" ]; then
ln -sf "$INSTALL_DIR/bin/myapp" /usr/local/bin/myapp
fi
echo -e "${GREEN}安装完成!${NC}"
echo "安装路径: $INSTALL_DIR"
}
# 主函数
main() {
show_header
check_dependencies
select_install_dir
perform_installation
}
main "$@"
# 这里是归档数据(生成安装包时填充)
__ARCHIVE__
生成完整安装包的脚本
#!/bin/bash
# build_installer.sh - 生成安装包
# 创建安装包内容
create_package() {
# 创建临时目录
BUILD_DIR=$(mktemp -d)
# 创建应用文件
mkdir -p "$BUILD_DIR/bin"
cat > "$BUILD_DIR/bin/myapp" << 'EOF'
#!/bin/bash
echo "Hello from MyApp v1.0.0"
EOF
chmod +x "$BUILD_DIR/bin/myapp"
# 创建配置文件
cat > "$BUILD_DIR/config.ini" << EOF
[app]
name=MyApp
version=1.0.0
EOF
# 创建文档
echo "MyApp 用户手册" > "$BUILD_DIR/README.txt"
# 打包
tar -czf package.tar.gz -C "$BUILD_DIR" .
# 清理
rm -rf "$BUILD_DIR"
}
# 生成安装器
generate_installer() {
# 使用高级安装脚本模板
cp advanced_install.sh final_installer.sh
# 追加打包的数据
cat package.tar.gz >> final_installer.sh
# 设置执行权限
chmod +x final_installer.sh
echo "安装包已生成: final_installer.sh"
}
# 清理
cleanup() {
rm -f package.tar.gz
}
# 主函数
main() {
echo "构建安装包..."
create_package
generate_installer
cleanup
echo "完成!"
}
main
使用方法
-
简单脚本安装包:
./install.sh
-
makeself生成的安装包:
# 生成安装包 ./build_installer.sh # 运行安装 ./final_installer.sh
-
Python生成的安装包:
python3 create_installer.py ./myapp_installer.sh
这些方法都能创建简易的安装包,选择哪种取决于你的具体需求和应用场景。