feat: 发布v5.3.0正式版本,完善跨平台适配与功能优化
本次更新包含多项核心改进: 1. 新增统一跨平台导航扩展,替换原有GoRouter调用,适配鸿蒙平台路由逻辑 2. 重构状态初始化逻辑,使用Future.microtask避免BuildContext异常 3. 完善Linux桌面端支持,添加桌面文件、AppData配置与WSL构建脚本 4. 修复鸿蒙平台动画渲染异常问题,移除平台特判逻辑 5. 优化NFC配对扫描参数,精简不必要的配置项 6. 更新依赖版本与项目版本号 7. 修复Drift数据库缓存问题,移除冗余的表检测逻辑 8. 添加路由观察者日志,优化鸿蒙端路由调试体验 9. 完善签到与文章发布后的用户数据刷新逻辑 10. 删除冗余的子模块与日志文件,清理项目结构
This commit is contained in:
151
linux/packaging/build_all.sh
Normal file
151
linux/packaging/build_all.sh
Normal file
@@ -0,0 +1,151 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# 闲言APP — Linux一键构建+打包脚本
|
||||
# 创建时间: 2026-05-18
|
||||
# 更新时间: 2026-05-18
|
||||
# 作用: 在WSL/Linux中一键完成Flutter构建和所有格式打包
|
||||
# 上次更新: 初始创建
|
||||
# ============================================================
|
||||
|
||||
set -e
|
||||
|
||||
APP_NAME="xianyan"
|
||||
APP_VERSION="5.2.0"
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PROJECT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
||||
|
||||
echo "=========================================="
|
||||
echo " 闲言 v${APP_VERSION} — Linux 一键构建打包"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
check_flutter() {
|
||||
if ! command -v flutter &> /dev/null; then
|
||||
echo "❌ Flutter 未安装,请先安装 Flutter SDK"
|
||||
echo " 参考: https://docs.flutter.dev/get-started/install/linux"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ Flutter: $(flutter --version | head -1)"
|
||||
}
|
||||
|
||||
install_deps() {
|
||||
echo ""
|
||||
echo "📦 检查系统依赖..."
|
||||
local deps=(
|
||||
clang cmake ninja-build pkg-config
|
||||
libgtk-3-dev liblzma-dev libstdc++-12-dev
|
||||
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
|
||||
libasound2-dev libsecret-1-dev libbluetooth-dev
|
||||
libnotify-dev libmpv-dev
|
||||
curl unzip xz-utils zip dpkg-dev fakeroot
|
||||
)
|
||||
|
||||
local missing=()
|
||||
for dep in "${deps[@]}"; do
|
||||
if ! dpkg -s "$dep" &> /dev/null 2>&1; then
|
||||
missing+=("$dep")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#missing[@]} -gt 0 ]; then
|
||||
echo "📥 安装缺失依赖: ${missing[*]}"
|
||||
sudo apt update
|
||||
sudo apt install -y "${missing[@]}" || {
|
||||
echo "⚠️ 部分依赖安装失败,尝试继续构建..."
|
||||
}
|
||||
else
|
||||
echo "✅ 所有系统依赖已安装"
|
||||
fi
|
||||
}
|
||||
|
||||
build_flutter() {
|
||||
echo ""
|
||||
echo "🔨 Flutter 构建 (Release)..."
|
||||
cd "${PROJECT_DIR}"
|
||||
|
||||
flutter config --enable-linux-desktop
|
||||
|
||||
flutter pub get
|
||||
|
||||
flutter build linux --release
|
||||
|
||||
if [ ! -d "build/linux/x64/release/bundle" ]; then
|
||||
echo "❌ 构建失败,bundle 目录不存在"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Flutter 构建成功"
|
||||
echo " 产物: build/linux/x64/release/bundle/"
|
||||
}
|
||||
|
||||
package_all() {
|
||||
echo ""
|
||||
echo "📦 开始打包所有格式..."
|
||||
cd "${PROJECT_DIR}"
|
||||
|
||||
mkdir -p dist
|
||||
|
||||
echo ""
|
||||
echo "--- [1/3] tar.gz 便携包 ---"
|
||||
bash linux/packaging/build_tarball.sh
|
||||
|
||||
echo ""
|
||||
echo "--- [2/3] .deb 安装包 ---"
|
||||
bash linux/packaging/build_deb.sh
|
||||
|
||||
echo ""
|
||||
echo "--- [3/3] AppImage ---"
|
||||
bash linux/packaging/build_appimage.sh
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " ✅ 全部打包完成!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "产物列表:"
|
||||
ls -lh dist/ 2>/dev/null || echo " (无产物)"
|
||||
echo ""
|
||||
echo "安装方式:"
|
||||
echo " .deb: sudo dpkg -i dist/${APP_NAME}_${APP_VERSION}_amd64.deb"
|
||||
echo " AppImage: chmod +x dist/${APP_NAME}_${APP_VERSION}_x86_64.AppImage && ./dist/${APP_NAME}_${APP_VERSION}_x86_64.AppImage"
|
||||
echo " tar.gz: tar -xzf dist/${APP_NAME}_${APP_VERSION}_linux_x64.tar.gz && cd ${APP_NAME}_${APP_VERSION}_linux_x64 && ./run.sh"
|
||||
}
|
||||
|
||||
case "${1:-all}" in
|
||||
deps)
|
||||
install_deps
|
||||
;;
|
||||
build)
|
||||
check_flutter
|
||||
build_flutter
|
||||
;;
|
||||
deb)
|
||||
bash linux/packaging/build_deb.sh
|
||||
;;
|
||||
appimage)
|
||||
bash linux/packaging/build_appimage.sh
|
||||
;;
|
||||
tarball)
|
||||
bash linux/packaging/build_tarball.sh
|
||||
;;
|
||||
package)
|
||||
package_all
|
||||
;;
|
||||
all|"")
|
||||
check_flutter
|
||||
install_deps
|
||||
build_flutter
|
||||
package_all
|
||||
;;
|
||||
*)
|
||||
echo "用法: $0 {deps|build|deb|appimage|tarball|package|all}"
|
||||
echo ""
|
||||
echo " deps — 仅安装系统依赖"
|
||||
echo " build — 仅Flutter构建"
|
||||
echo " deb — 仅打包.deb"
|
||||
echo " appimage — 仅打包AppImage"
|
||||
echo " tarball — 仅打包tar.gz"
|
||||
echo " package — 打包所有格式(需先build)"
|
||||
echo " all — 完整流程: 依赖→构建→打包(默认)"
|
||||
;;
|
||||
esac
|
||||
126
linux/packaging/build_appimage.sh
Normal file
126
linux/packaging/build_appimage.sh
Normal file
@@ -0,0 +1,126 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# 闲言APP — Linux打包脚本 (AppImage)
|
||||
# 创建时间: 2026-05-18
|
||||
# 更新时间: 2026-05-18
|
||||
# 作用: 将Flutter Linux构建产物打包为AppImage通用安装包
|
||||
# 上次更新: 初始创建
|
||||
# ============================================================
|
||||
|
||||
set -e
|
||||
|
||||
APP_NAME="xianyan"
|
||||
APP_DISPLAY_NAME="闲言"
|
||||
APP_ID="com.example.xianyan"
|
||||
APP_VERSION="5.2.0"
|
||||
BUILD_DIR="build/linux/x64/release/bundle"
|
||||
OUTPUT_DIR="dist"
|
||||
APPDIR="${OUTPUT_DIR}/appimage_staging/${APP_NAME}.AppDir"
|
||||
|
||||
echo "=========================================="
|
||||
echo " ${APP_DISPLAY_NAME} — AppImage 打包"
|
||||
echo "=========================================="
|
||||
|
||||
if [ ! -d "${BUILD_DIR}" ]; then
|
||||
echo "❌ 构建产物不存在,请先运行: flutter build linux --release"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
which appimagetool > /dev/null 2>&1 || {
|
||||
echo "📥 下载 appimagetool..."
|
||||
ARCH=$(uname -m)
|
||||
wget -q "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-${ARCH}.AppImage" -O /tmp/appimagetool
|
||||
chmod +x /tmp/appimagetool
|
||||
APPIMAGETOOL="/tmp/appimagetool"
|
||||
}
|
||||
APPIMAGETOOL="${APPIMAGETOOL:-appimagetool}"
|
||||
|
||||
rm -rf "${APPDIR}"
|
||||
mkdir -p "${APPDIR}/usr/bin"
|
||||
mkdir -p "${APPDIR}/usr/lib"
|
||||
mkdir -p "${APPDIR}/usr/share/applications"
|
||||
mkdir -p "${APPDIR}/usr/share/metainfo"
|
||||
mkdir -p "${APPDIR}/usr/share/icons/hicolor/scalable/apps"
|
||||
mkdir -p "${APPDIR}/usr/share/icons/hicolor/256x256/apps"
|
||||
|
||||
echo "📦 复制构建产物..."
|
||||
cp -r "${BUILD_DIR}"/* "${APPDIR}/usr/bin/"
|
||||
chmod +x "${APPDIR}/usr/bin/${APP_NAME}"
|
||||
|
||||
echo "📝 创建AppRun入口..."
|
||||
cat > "${APPDIR}/AppRun" << 'EOF'
|
||||
#!/bin/bash
|
||||
SELF=$(readlink -f "$0")
|
||||
HERE=${SELF%/*}
|
||||
export PATH="${HERE}/usr/bin:${PATH}"
|
||||
export LD_LIBRARY_PATH="${HERE}/usr/lib:${HERE}/usr/bin/lib:${LD_LIBRARY_PATH}"
|
||||
export XDG_DATA_DIRS="${HERE}/usr/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
|
||||
export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas:${GSETTINGS_SCHEMA_DIR}"
|
||||
|
||||
# GSTREAMER插件路径
|
||||
export GST_PLUGIN_SYSTEM_PATH="${HERE}/usr/lib/gstreamer-1.0:${GST_PLUGIN_SYSTEM_PATH:-}"
|
||||
|
||||
exec "${HERE}/usr/bin/xianyan" "$@"
|
||||
EOF
|
||||
chmod +x "${APPDIR}/AppRun"
|
||||
|
||||
echo "🖥️ 创建desktop文件..."
|
||||
if [ -f "linux/${APP_ID}.desktop" ]; then
|
||||
cp "linux/${APP_ID}.desktop" "${APPDIR}/"
|
||||
sed -i "s|Exec=xianyan|Exec=${APP_NAME}|g" "${APPDIR}/${APP_ID}.desktop"
|
||||
sed -i "s|Icon=com.example.xianyan|Icon=${APP_ID}|g" "${APPDIR}/${APP_ID}.desktop"
|
||||
else
|
||||
cat > "${APPDIR}/${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=文字阅读更纯粹
|
||||
Icon=${APP_ID}
|
||||
Exec=${APP_NAME}
|
||||
Terminal=false
|
||||
StartupNotify=true
|
||||
Categories=Utility;Literature;Graphics;
|
||||
StartupWMClass=${APP_NAME}
|
||||
EOF
|
||||
fi
|
||||
|
||||
echo "📋 复制AppStream元数据..."
|
||||
if [ -f "linux/${APP_ID}.appdata.xml" ]; then
|
||||
cp "linux/${APP_ID}.appdata.xml" "${APPDIR}/usr/share/metainfo/"
|
||||
fi
|
||||
|
||||
echo "🎨 创建占位图标..."
|
||||
SVG_ICON="${APPDIR}/usr/share/icons/hicolor/scalable/apps/${APP_ID}.svg"
|
||||
cat > "${SVG_ICON}" << 'SVGEOF'
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">
|
||||
<defs>
|
||||
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#1a1a2e"/>
|
||||
<stop offset="100%" style="stop-color:#16213e"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect width="256" height="256" rx="56" fill="url(#bg)"/>
|
||||
<text x="128" y="160" text-anchor="middle" font-size="120" font-family="serif" fill="#e8e8e8">言</text>
|
||||
</svg>
|
||||
SVGEOF
|
||||
|
||||
mkdir -p "${APPDIR}/.DirIcon"
|
||||
cp "${SVG_ICON}" "${APPDIR}/.DirIcon" 2>/dev/null || true
|
||||
|
||||
mkdir -p "${OUTPUT_DIR}"
|
||||
APPIMAGE_FILE="${OUTPUT_DIR}/${APP_NAME}_${APP_VERSION}_x86_64.AppImage"
|
||||
echo "🔨 构建AppImage..."
|
||||
${APPIMAGETOOL} "${APPDIR}" "${APPIMAGE_FILE}"
|
||||
|
||||
APPIMAGE_SIZE=$(du -sh "${APPIMAGE_FILE}" | cut -f1)
|
||||
echo ""
|
||||
echo "✅ AppImage 打包完成!"
|
||||
echo " 文件: ${APPIMAGE_FILE}"
|
||||
echo " 大小: ${APPIMAGE_SIZE}"
|
||||
echo ""
|
||||
echo "运行命令: chmod +x ${APPIMAGE_FILE} && ./${APPIMAGE_FILE}"
|
||||
|
||||
rm -rf "${APPDIR}"
|
||||
151
linux/packaging/build_deb.sh
Normal file
151
linux/packaging/build_deb.sh
Normal file
@@ -0,0 +1,151 @@
|
||||
#!/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="com.example.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: 闲言 <xianyan@example.com>
|
||||
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}"
|
||||
146
linux/packaging/build_tarball.sh
Normal file
146
linux/packaging/build_tarball.sh
Normal file
@@ -0,0 +1,146 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# 闲言APP — Linux打包脚本 (tar.gz 便携包)
|
||||
# 创建时间: 2026-05-18
|
||||
# 更新时间: 2026-05-18
|
||||
# 作用: 将Flutter Linux构建产物打包为tar.gz便携压缩包
|
||||
# 上次更新: 初始创建
|
||||
# ============================================================
|
||||
|
||||
set -e
|
||||
|
||||
APP_NAME="xianyan"
|
||||
APP_DISPLAY_NAME="闲言"
|
||||
APP_ID="com.example.xianyan"
|
||||
APP_VERSION="5.2.0"
|
||||
BUILD_DIR="build/linux/x64/release/bundle"
|
||||
OUTPUT_DIR="dist"
|
||||
TAR_ROOT="${OUTPUT_DIR}/tarball_staging/${APP_NAME}_${APP_VERSION}_linux_x64"
|
||||
|
||||
echo "=========================================="
|
||||
echo " ${APP_DISPLAY_NAME} — tar.gz 便携包打包"
|
||||
echo "=========================================="
|
||||
|
||||
if [ ! -d "${BUILD_DIR}" ]; then
|
||||
echo "❌ 构建产物不存在,请先运行: flutter build linux --release"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rm -rf "${TAR_ROOT}"
|
||||
mkdir -p "${TAR_ROOT}"
|
||||
|
||||
echo "📦 复制构建产物..."
|
||||
cp -r "${BUILD_DIR}"/* "${TAR_ROOT}/"
|
||||
chmod +x "${TAR_ROOT}/${APP_NAME}"
|
||||
|
||||
echo "📋 复制桌面集成文件..."
|
||||
if [ -f "linux/${APP_ID}.desktop" ]; then
|
||||
cp "linux/${APP_ID}.desktop" "${TAR_ROOT}/"
|
||||
fi
|
||||
if [ -f "linux/${APP_ID}.appdata.xml" ]; then
|
||||
cp "linux/${APP_ID}.appdata.xml" "${TAR_ROOT}/"
|
||||
fi
|
||||
|
||||
echo "📝 创建启动脚本..."
|
||||
cat > "${TAR_ROOT}/run.sh" << 'EOF'
|
||||
#!/bin/bash
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
export LD_LIBRARY_PATH="${SCRIPT_DIR}/lib:${LD_LIBRARY_PATH}"
|
||||
export XDG_DATA_DIRS="${SCRIPT_DIR}/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
|
||||
exec "${SCRIPT_DIR}/xianyan" "$@"
|
||||
EOF
|
||||
chmod +x "${TAR_ROOT}/run.sh"
|
||||
|
||||
echo "📝 创建安装脚本..."
|
||||
cat > "${TAR_ROOT}/install.sh" << 'EOF'
|
||||
#!/bin/bash
|
||||
set -e
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
INSTALL_DIR="/opt/xianyan"
|
||||
DESKTOP_FILE="/usr/share/applications/com.example.xianyan.desktop"
|
||||
|
||||
echo "🔧 安装闲言到 ${INSTALL_DIR}..."
|
||||
sudo cp -r "${SCRIPT_DIR}" "${INSTALL_DIR}"
|
||||
sudo chmod +x "${INSTALL_DIR}/xianyan"
|
||||
|
||||
echo "🖥️ 创建桌面快捷方式..."
|
||||
sudo tee "${DESKTOP_FILE}" > /dev/null << DESKTOP
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Version=1.5
|
||||
Name=闲言
|
||||
Name[zh_CN]=闲言
|
||||
Name[en]=Xianyan
|
||||
Comment=文字阅读更纯粹
|
||||
Icon=com.example.xianyan
|
||||
Exec=/opt/xianyan/xianyan
|
||||
Terminal=false
|
||||
StartupNotify=true
|
||||
Categories=Utility;Literature;Graphics;
|
||||
StartupWMClass=xianyan
|
||||
DESKTOP
|
||||
|
||||
sudo update-desktop-database /usr/share/applications 2>/dev/null || true
|
||||
echo "✅ 安装完成! 可从应用菜单启动「闲言」"
|
||||
echo " 卸载: sudo rm -rf ${INSTALL_DIR} ${DESKTOP_FILE}"
|
||||
EOF
|
||||
chmod +x "${TAR_ROOT}/install.sh"
|
||||
|
||||
echo "📝 创建卸载脚本..."
|
||||
cat > "${TAR_ROOT}/uninstall.sh" << 'EOF'
|
||||
#!/bin/bash
|
||||
set -e
|
||||
echo "🗑️ 卸载闲言..."
|
||||
sudo rm -rf /opt/xianyan
|
||||
sudo rm -f /usr/share/applications/com.example.xianyan.desktop
|
||||
sudo update-desktop-database /usr/share/applications 2>/dev/null || true
|
||||
echo "✅ 卸载完成"
|
||||
EOF
|
||||
chmod +x "${TAR_ROOT}/uninstall.sh"
|
||||
|
||||
echo "📝 创建README..."
|
||||
cat > "${TAR_ROOT}/README.txt" << EOF
|
||||
${APP_DISPLAY_NAME} v${APP_VERSION} — Linux 便携版
|
||||
========================================
|
||||
|
||||
快速启动:
|
||||
./run.sh
|
||||
|
||||
安装到系统:
|
||||
./install.sh
|
||||
|
||||
从系统卸载:
|
||||
./uninstall.sh
|
||||
|
||||
系统要求:
|
||||
- Linux x86_64 (Ubuntu 20.04+ / Debian 11+ / Fedora 35+)
|
||||
- GTK 3.24+
|
||||
- GStreamer 1.14+
|
||||
- ALSA / PulseAudio
|
||||
- 至少 2GB 内存
|
||||
|
||||
依赖安装 (Ubuntu/Debian):
|
||||
sudo apt install libgtk-3-0 libglib2.0-0 libgstreamer1.0-0 \\
|
||||
libgstreamer-plugins-base1.0-0 libasound2 libsecret-1-0 \\
|
||||
gstreamer1.0-plugins-good gstreamer1.0-libav fonts-noto-cjk
|
||||
EOF
|
||||
|
||||
mkdir -p "${OUTPUT_DIR}"
|
||||
TAR_FILE="${OUTPUT_DIR}/${APP_NAME}_${APP_VERSION}_linux_x64.tar.gz"
|
||||
|
||||
echo "🔨 压缩打包..."
|
||||
cd "${OUTPUT_DIR}/tarball_staging"
|
||||
tar -czf "../$(basename ${TAR_FILE})" "${APP_NAME}_${APP_VERSION}_linux_x64/"
|
||||
cd - > /dev/null
|
||||
|
||||
TAR_SIZE=$(du -sh "${TAR_FILE}" | cut -f1)
|
||||
echo ""
|
||||
echo "✅ tar.gz 打包完成!"
|
||||
echo " 文件: ${TAR_FILE}"
|
||||
echo " 大小: ${TAR_SIZE}"
|
||||
echo ""
|
||||
echo "使用方法:"
|
||||
echo " 解压: tar -xzf $(basename ${TAR_FILE})"
|
||||
echo " 运行: cd ${APP_NAME}_${APP_VERSION}_linux_x64 && ./run.sh"
|
||||
|
||||
rm -rf "${OUTPUT_DIR}/tarball_staging"
|
||||
75
linux/packaging/setup_wsl.sh
Normal file
75
linux/packaging/setup_wsl.sh
Normal file
@@ -0,0 +1,75 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# 闲言APP — WSL环境初始化脚本
|
||||
# 创建时间: 2026-05-18
|
||||
# 更新时间: 2026-05-18
|
||||
# 作用: 在Windows WSL中初始化Flutter Linux构建环境
|
||||
# 上次更新: 初始创建
|
||||
# ============================================================
|
||||
|
||||
set -e
|
||||
|
||||
echo "=========================================="
|
||||
echo " 闲言 — WSL 构建环境初始化"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
echo "📦 更新系统包..."
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
|
||||
echo "📦 安装构建工具和系统依赖..."
|
||||
sudo apt install -y \
|
||||
clang cmake ninja-build pkg-config \
|
||||
libgtk-3-dev liblzma-dev libstdc++-12-dev \
|
||||
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
|
||||
libgstreamer-plugins-good1.0-dev \
|
||||
libgstreamer-plugins-bad1.0-dev \
|
||||
libgstreamer1.0-libav \
|
||||
libasound2-dev libsecret-1-dev libbluetooth-dev \
|
||||
libnotify-dev libmpv-dev libx11-dev \
|
||||
curl unzip xz-utils zip dpkg-dev fakeroot \
|
||||
fonts-noto-cjk fonts-noto-color-emoji \
|
||||
git wget
|
||||
|
||||
echo ""
|
||||
echo "🔍 检查 Flutter SDK..."
|
||||
if command -v flutter &> /dev/null; then
|
||||
echo "✅ Flutter 已安装: $(flutter --version | head -1)"
|
||||
else
|
||||
echo "📥 安装 Flutter SDK..."
|
||||
git clone https://github.com/flutter/flutter.git -b stable --depth 1 "$HOME/flutter"
|
||||
echo "" >> "$HOME/.bashrc"
|
||||
echo "export PATH=\"\$HOME/flutter/bin:\$PATH\"" >> "$HOME/.bashrc"
|
||||
export PATH="$HOME/flutter/bin:$PATH"
|
||||
flutter doctor
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "🔧 启用 Linux 桌面支持..."
|
||||
flutter config --enable-linux-desktop
|
||||
|
||||
echo ""
|
||||
echo "📋 Flutter Doctor..."
|
||||
flutter doctor -v
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " ✅ WSL 环境初始化完成!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "下一步:"
|
||||
echo " 1. 将项目复制到WSL本地(加速构建):"
|
||||
echo " cp -r /mnt/e/project/flutter/f/xianyan ~/xianyan"
|
||||
echo ""
|
||||
echo " 2. 进入项目目录:"
|
||||
echo " cd ~/xianyan"
|
||||
echo ""
|
||||
echo " 3. 一键构建打包:"
|
||||
echo " bash linux/packaging/build_all.sh"
|
||||
echo ""
|
||||
echo " 或者分步执行:"
|
||||
echo " flutter pub get"
|
||||
echo " flutter build linux --release"
|
||||
echo " bash linux/packaging/build_tarball.sh"
|
||||
echo " bash linux/packaging/build_deb.sh"
|
||||
echo " bash linux/packaging/build_appimage.sh"
|
||||
Reference in New Issue
Block a user