#!/bin/bash # ============================================================ # 闲言APP — Linux打包脚本 (Debian/Ubuntu .deb) # 创建时间: 2026-05-18 # 更新时间: 2026-05-18 # 作用: 将Flutter Linux构建产物打包为.deb安装包 # 上次更新: 初始创建 # ============================================================ set -e APP_NAME="xianyan" APP_DISPLAY_NAME="闲言" APP_ID="apps.xy.xianyan" APP_VERSION="5.2.0" APP_ARCH="amd64" BUILD_DIR="build/linux/x64/release/bundle" OUTPUT_DIR="dist" DEB_ROOT="${OUTPUT_DIR}/deb_staging" echo "==========================================" echo " ${APP_DISPLAY_NAME} — .deb 打包" echo "==========================================" if [ ! -d "${BUILD_DIR}" ]; then echo "❌ 构建产物不存在,请先运行: flutter build linux --release" exit 1 fi rm -rf "${DEB_ROOT}" mkdir -p "${DEB_ROOT}/DEBIAN" mkdir -p "${DEB_ROOT}/opt/${APP_NAME}" mkdir -p "${DEB_ROOT}/usr/bin" mkdir -p "${DEB_ROOT}/usr/share/applications" mkdir -p "${DEB_ROOT}/usr/share/metainfo" mkdir -p "${DEB_ROOT}/usr/share/icons/hicolor/scalable/apps" mkdir -p "${DEB_ROOT}/usr/share/icons/hicolor/256x256/apps" mkdir -p "${DEB_ROOT}/usr/share/icons/hicolor/128x128/apps" mkdir -p "${DEB_ROOT}/usr/share/icons/hicolor/64x64/apps" mkdir -p "${DEB_ROOT}/usr/share/icons/hicolor/48x48/apps" mkdir -p "${DEB_ROOT}/usr/share/doc/${APP_NAME}" echo "📦 复制构建产物..." cp -r "${BUILD_DIR}"/* "${DEB_ROOT}/opt/${APP_NAME}/" chmod +x "${DEB_ROOT}/opt/${APP_NAME}/${APP_NAME}" echo "📝 创建符号链接..." ln -sf "/opt/${APP_NAME}/${APP_NAME}" "${DEB_ROOT}/usr/bin/${APP_NAME}" echo "📋 创建控制文件..." cat > "${DEB_ROOT}/DEBIAN/control" << EOF Package: ${APP_NAME} Version: ${APP_VERSION} Section: utils Priority: optional Architecture: ${APP_ARCH} Depends: libgtk-3-0 (>= 3.24), libglib2.0-0 (>= 2.58), libpango-1.0-0 (>= 1.42), libharfbuzz0b (>= 2.0), libcairo2 (>= 1.16), libgdk-pixbuf-2.0-0 (>= 2.38), libgstreamer1.0-0 (>= 1.14), libgstreamer-plugins-base1.0-0 (>= 1.14), libasound2 (>= 1.1), libsecret-1-0 (>= 0.18), libbluetooth3 (>= 5.48), libnotify4 (>= 0.7), libmpv2 (>= 0.29) | libmpv1 Recommends: gstreamer1.0-plugins-good, gstreamer1.0-plugins-bad, gstreamer1.0-libav Suggests: fonts-noto-cjk, fonts-noto-color-emoji Maintainer: 闲言 Description: ${APP_DISPLAY_NAME} — 文字阅读更纯粹 句子阅读与壁纸制作应用,提供精选句子每日推荐、 壁纸制作与分享、卡片式阅读体验等功能。 Installed-Size: $(du -sk "${DEB_ROOT}/opt/${APP_NAME}" | cut -f1) EOF echo "📋 创建postinst脚本..." cat > "${DEB_ROOT}/DEBIAN/postinst" << 'EOF' #!/bin/bash set -e update-desktop-database /usr/share/applications 2>/dev/null || true gtk-update-icon-cache /usr/share/icons/hicolor 2>/dev/null || true update-mime-database /usr/share/mime 2>/dev/null || true EOF chmod 755 "${DEB_ROOT}/DEBIAN/postinst" echo "📋 创建postrm脚本..." cat > "${DEB_ROOT}/DEBIAN/postrm" << 'EOF' #!/bin/bash set -e update-desktop-database /usr/share/applications 2>/dev/null || true gtk-update-icon-cache /usr/share/icons/hicolor 2>/dev/null || true EOF chmod 755 "${DEB_ROOT}/DEBIAN/postrm" echo "🖥️ 创建桌面快捷方式..." if [ -f "linux/${APP_ID}.desktop" ]; then cp "linux/${APP_ID}.desktop" "${DEB_ROOT}/usr/share/applications/" else cat > "${DEB_ROOT}/usr/share/applications/${APP_ID}.desktop" << EOF [Desktop Entry] Type=Application Version=1.5 Name=${APP_DISPLAY_NAME} Name[zh_CN]=${APP_DISPLAY_NAME} Name[en]=Xianyan Comment=文字阅读更纯粹 Comment[zh_CN]=文字阅读更纯粹 Comment[en]=Pure reading Icon=${APP_ID} Exec=/opt/${APP_NAME}/${APP_NAME} Terminal=false StartupNotify=true Categories=Utility;Literature;Graphics; Keywords=reading;sentence;wallpaper; StartupWMClass=${APP_NAME} MimeType=text/plain;x-scheme-handler/xianyan; X-GNOME-UsesNotifications=true EOF fi echo "📋 创建AppStream元数据..." if [ -f "linux/${APP_ID}.appdata.xml" ]; then cp "linux/${APP_ID}.appdata.xml" "${DEB_ROOT}/usr/share/metainfo/" fi echo "📄 创建版权文件..." cat > "${DEB_ROOT}/usr/share/doc/${APP_NAME}/copyright" << EOF Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: ${APP_NAME} Upstream-Contact: xianyan@example.com Files: * Copyright: 2026 闲言 License: proprietary EOF echo "📋 注册URL Scheme..." cat > "${DEB_ROOT}/usr/share/applications/${APP_ID}-url.desktop" << EOF [Desktop Entry] Type=Application Name=${APP_DISPLAY_NAME} URL Handler NoDisplay=true Exec=/opt/${APP_NAME}/${APP_NAME} %u MimeType=x-scheme-handler/xianyan; EOF mkdir -p "${OUTPUT_DIR}" DEB_FILE="${OUTPUT_DIR}/${APP_NAME}_${APP_VERSION}_${APP_ARCH}.deb" dpkg-deb --build "${DEB_ROOT}" "${DEB_FILE}" DEB_SIZE=$(du -sh "${DEB_FILE}" | cut -f1) echo "" echo "✅ .deb 打包完成!" echo " 文件: ${DEB_FILE}" echo " 大小: ${DEB_SIZE}" echo "" echo "安装命令: sudo dpkg -i ${DEB_FILE}" echo "卸载命令: sudo dpkg -r ${APP_NAME}" rm -rf "${DEB_ROOT}"