# config Editor 一键构建脚本 set -e # 配置变量 PACKAGE_NAME="config-editor" VERSION="1.0" ARCHITECTURE="amd64" MAINTAINER="hjy " echo "==========================================" echo "Config Editor 构建脚本 (虚拟环境版)" echo "版本: $VERSION" echo "架构: $ARCHITECTURE" echo "==========================================" # 检查依赖 echo "检查构建依赖..." if ! command -v dpkg-deb &> /dev/null; then echo "错误: 需要 dpkg-deb,请安装: sudo apt install dpkg-dev" exit 1 fi # 检查源代码是否存在 echo "检查源代码..." if [ ! -f "config_editor.py" ]; then echo "错误: 未找到主程序文件 config_editor.py" echo "请确保在项目根目录运行此脚本,且包含 config_editor.py 文件" exit 1 fi # 创建构建目录 BUILD_DIR="/tmp/${PACKAGE_NAME}-build" echo "创建构建目录: $BUILD_DIR" rm -rf "$BUILD_DIR" mkdir -p "$BUILD_DIR/DEBIAN" mkdir -p "$BUILD_DIR/usr/share/applications" mkdir -p "$BUILD_DIR/usr/share/config-editor" mkdir -p "$BUILD_DIR/usr/bin" # 复制应用文件 echo "复制应用文件..." echo "复制主程序 config_editor.py" cp config_editor.py "$BUILD_DIR/usr/share/config-editor/" # 复制配置文件 if [ -f "config_editor_rules.json" ]; then echo "复制配置文件 config_editor_rules.json" cp config_editor_rules.json "$BUILD_DIR/usr/share/config-editor/" else echo "警告: 未找到 config_editor_rules.json 文件" fi if [ -f "config_editor_settings.json" ]; then echo "复制配置文件 config_editor_settings.json" cp config_editor_settings.json "$BUILD_DIR/usr/share/config-editor/" else echo "警告: 未找到 config_editor_settings.json 文件" fi # 复制所有Python文件 echo "复制其他Python文件..." find . -maxdepth 1 -name "*.py" ! -name "build.sh" -exec cp {} "$BUILD_DIR/usr/share/config-editor/" \; 2>/dev/null || true # 显示复制的文件 echo "已复制的文件:" ls -la "$BUILD_DIR/usr/share/config-editor/" # 检查是否复制了真实的应用文件 if [ ! -f "$BUILD_DIR/usr/share/config-editor/config_editor.py" ]; then echo "错误: 未成功复制 config_editor.py 文件" exit 1 fi # 创建桌面文件 echo "创建桌面文件..." cat > "$BUILD_DIR/usr/share/applications/config-editor.desktop" << EOF [Desktop Entry] Version=1.1 Type=Application Name=Config Editor Comment=Configuration Management System Exec=config-editor Icon=config-editor Categories=Development;Settings; Terminal=false StartupWMClass=ConfigEditor EOF # 创建虚拟环境安装脚本(已修复权限问题) echo "创建虚拟环境安装脚本..." cat > "$BUILD_DIR/usr/share/config-editor/setup_venv.sh" << 'EOF' #!/bin/bash # 虚拟环境安装脚本 APP_DIR="/usr/share/config-editor" VENV_DIR="$APP_DIR/venv" echo "设置Config Editor虚拟环境..." # 检查是否使用sudo if [ "$EUID" -ne 0 ]; then echo "错误: 请使用sudo运行此脚本" echo "命令: sudo $0" exit 1 fi # 检查虚拟环境是否存在 if [ ! -d "$VENV_DIR" ]; then echo "创建虚拟环境..." python3 -m venv --system-site-packages "$VENV_DIR" if [ $? -ne 0 ]; then echo "错误: 无法创建虚拟环境" echo "请确保已安装 python3-venv: sudo apt install python3-venv" exit 1 fi fi # 激活虚拟环境并安装依赖 echo "激活虚拟环境并安装依赖..." source "$VENV_DIR/bin/activate" # 修复权限问题 echo "修复虚拟环境权限..." chmod -R 755 "$VENV_DIR" chmod +x "$VENV_DIR/bin"/* 2>/dev/null || true chmod +x "$VENV_DIR/bin/python" 2>/dev/null || true chmod +x "$VENV_DIR/bin/pip" 2>/dev/null || true # 升级pip echo "升级pip..." python -m pip install --upgrade pip # 安装PyQt6 echo "安装PyQt6..." pip install PyQt6 -i https://pypi.tuna.tsinghua.edu.cn/simple/ # 如果有requirements.txt,安装其他依赖 if [ -f "$APP_DIR/requirements.txt" ]; then echo "安装其他依赖..." pip install -r "$APP_DIR/requirements.txt" -i https://pypi.tuna.tsinghua.edu.cn/simple/ fi # 再次确保权限正确 echo "设置最终权限..." chmod -R 755 "$VENV_DIR" chmod +x "$VENV_DIR/bin"/* 2>/dev/null || true echo "虚拟环境设置完成" echo "安装在虚拟环境中的包:" pip list EOF chmod +x "$BUILD_DIR/usr/share/config-editor/setup_venv.sh" # 创建启动脚本 - 使用虚拟环境(已修复权限检查) echo "创建启动脚本..." cat > "$BUILD_DIR/usr/bin/config-editor" << 'EOF' #!/bin/bash # Config Editor 启动脚本 - 虚拟环境版本 # 应用目录 APP_DIR="/usr/share/config-editor" VENV_DIR="$APP_DIR/venv" LOG_FILE="${HOME}/.config/config-editor/log.txt" # 创建日志目录 mkdir -p "$(dirname "$LOG_FILE")" # 记录启动日志 echo "$(date): 启动Config Editor" >> "$LOG_FILE" # 设置环境变量 export DISPLAY=":${XDG_SESSION_DISPLAY:-1}" export XAUTHORITY="${HOME}/.Xauthority" # 尝试多种方法设置DBUS if [ -f "/run/user/$(id -u)/bus" ]; then export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus" elif [ -n "$DBUS_SESSION_BUS_ADDRESS" ]; then : # 保持已有设置 else # 尝试从进程获取 DBUS_ADDR=$(ps -u $(id -u) -o command | grep -o 'dbus-daemon.*address=unix:path=[^ ]*' | head -1 | sed 's/.*address=//') if [ -n "$DBUS_ADDR" ]; then export DBUS_SESSION_BUS_ADDRESS="$DBUS_ADDR" fi fi # 修复X11权限 if [ -f "${HOME}/.Xauthority" ]; then export XAUTHORITY="${HOME}/.Xauthority" fi # 检查虚拟环境 if [ ! -d "$VENV_DIR" ]; then echo "错误: 虚拟环境未找到。请先运行:" echo " sudo /usr/share/config-editor/setup_venv.sh" exit 1 fi # 检查并修复权限(如果需要) if [ ! -x "$VENV_DIR/bin/python" ] || [ ! -x "$VENV_DIR/bin/pip" ]; then echo "警告: 虚拟环境权限问题,请重新运行安装脚本:" echo " sudo /usr/share/config-editor/setup_venv.sh" exit 1 fi # 检查PyQt6是否安装 if ! "$VENV_DIR/bin/python" -c "import PyQt6" 2>/dev/null; then echo "错误: PyQt6未在虚拟环境中安装。请运行:" echo " sudo /usr/share/config-editor/setup_venv.sh" exit 1 fi # 切换到应用目录 cd "$APP_DIR" # 记录环境信息 echo "DISPLAY: $DISPLAY" >> "$LOG_FILE" echo "XAUTHORITY: $XAUTHORITY" >> "$LOG_FILE" # 使用虚拟环境运行Python应用 exec "$VENV_DIR/bin/python" config_editor.py "$@" >> "$LOG_FILE" 2>&1 EOF chmod +x "$BUILD_DIR/usr/bin/config-editor" # 创建控制文件 echo "创建DEBIAN控制文件..." cat > "$BUILD_DIR/DEBIAN/control" << EOF Package: $PACKAGE_NAME Version: $VERSION Architecture: $ARCHITECTURE Depends: python3, python3-venv Recommends: libnotify-bin, x11-xserver-utils Maintainer: $MAINTAINER Description: Configuration Management System (VirtualEnv) A PyQt6-based configuration management editor using virtual environment. Provides grouping management, validation rules, and auto-grouping features. This version uses virtual environment for PyQt6. EOF # 创建安装后脚本 echo "创建安装后脚本..." cat > "$BUILD_DIR/DEBIAN/postinst" << 'EOF' #!/bin/bash # 安装后脚本 set -e echo "Config Editor 安装完成!" echo "" echo "更新桌面数据库..." update-desktop-database /usr/share/applications 2>/dev/null || true echo "" echo "重要: 需要设置虚拟环境才能运行应用" echo "请执行以下命令完成安装:" echo " sudo /usr/share/config-editor/setup_venv.sh" echo "" echo "使用说明:" echo "1. 设置虚拟环境: sudo /usr/share/config-editor/setup_venv.sh" echo "2. 在终端运行: config-editor" # 设置文件权限 chmod 755 /usr/bin/config-editor chmod 755 /usr/share/config-editor/setup_venv.sh # 设置应用文件权限 chmod -R 644 /usr/share/config-editor/* 2>/dev/null || true chmod 755 /usr/share/config-editor/*.py 2>/dev/null || true chmod 755 /usr/share/config-editor/*.sh 2>/dev/null || true # 为虚拟环境目录预留权限 mkdir -p /usr/share/config-editor/venv 2>/dev/null || true chmod 755 /usr/share/config-editor/venv 2>/dev/null || true exit 0 EOF chmod +x "$BUILD_DIR/DEBIAN/postinst" # 构建deb包 echo "构建deb包..." dpkg-deb --build "$BUILD_DIR" "${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb" # 验证包 echo "验证deb包..." if dpkg -I "${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb" > /dev/null; then echo "✓ 包验证成功" else echo "✗ 包验证失败" exit 1 fi # 清理构建目录 echo "清理构建目录..." rm -rf "$BUILD_DIR" echo "" echo "==========================================" echo "构建成功完成!" echo "生成的deb包: ${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb" echo "" echo "安装步骤:" echo "1. 安装deb包: sudo dpkg -i ${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb" echo "2. 安装依赖(如有需要): sudo apt install -f" echo "3. 设置虚拟环境: sudo /usr/share/config-editor/setup_venv.sh" echo "" echo "此版本特点:" echo "✓ 修复了虚拟环境权限问题" echo "✓ 使用 --system-site-packages 参数" echo "✓ 自动使用清华PyPI镜像" echo "✓ 简化了依赖和脚本" echo "==========================================" # 显示包信息 echo "" echo "包信息:" dpkg -I "${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb"