如何用脚本生成简易安装包

wen 实用脚本 2

本文目录导读:

如何用脚本生成简易安装包

  1. shell脚本安装包(最简单)
  2. makeself工具(推荐)
  3. Python脚本创建安装包
  4. 高级版本:带交互功能的安装脚本
  5. 生成完整安装包的脚本
  6. 使用方法

我来介绍几种用脚本生成简易安装包的方法,主要适用于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

使用方法

  1. 简单脚本安装包

    ./install.sh
  2. makeself生成的安装包

    # 生成安装包
    ./build_installer.sh
    # 运行安装
    ./final_installer.sh
  3. Python生成的安装包

    python3 create_installer.py
    ./myapp_installer.sh

这些方法都能创建简易的安装包,选择哪种取决于你的具体需求和应用场景。

抱歉,评论功能暂时关闭!