elec_rag_ui/scripts/package-kylin-arm64-deb.sh
ssurui 1cb953eeb3 fix: 打包应用图标补齐常规尺寸,解决菜单栏图标不显示问题
之前只装了 hicolor/1024x1024 一个尺寸,UKUI 等桌面菜单按 48x48 等
常规尺寸查找图标时找不到,直接回退成缺省图标而不会从 1024 缩放。
现在按 16/24/32/48/64/128/256/512/1024 全部装进 hicolor 主题,并
额外在 /usr/share/pixmaps 放一份 48x48,兼容不认图标主题的老式菜单。

resources/icons/ 下是从 resources/icon.png 用 sips 预生成的各尺寸
PNG,随图标一起更新即可,不需要在打包时现场依赖 ImageMagick。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-22 12:16:13 +08:00

138 lines
4.9 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 在 Kylin V10 (RK3588, arm64) 上构建 elec_rag_ui 的 deb 安装包。
#
# 背景:electron-builder 自带的 fpm 打包路径在这类 arm64 Kylin 板子上有已知 bug——
# fpm 内部调用 tar 归档 data.tar.gz 时报 "tar failed (exit code 2)",无法通过
# `electron-builder --linux deb` 直接产出 deb。此脚本改用 electron-builder 的
# `dir` target 先产出 unpacked 应用目录,再手工拼装 DEBIAN 控制文件用 dpkg-deb 打包,
# 这条路径已在真机上验证可行。
#
# 必须在 arm64 Linux(如目标 pad 本身)上执行,依赖 dpkg-deb。
#
# 用法:bash scripts/package-kylin-arm64-deb.sh
set -e
cd "$(dirname "$0")/.."
if ! command -v dpkg-deb >/dev/null 2>&1; then
echo "错误:找不到 dpkg-deb,本脚本只能在 Debian/Kylin 系 arm64 Linux 上运行" >&2
exit 1
fi
if [ "$(uname -m)" != "aarch64" ]; then
echo "警告:当前架构不是 aarch64(实测为 $(uname -m)),继续执行但产物大概率无法在 arm64 pad 上运行" >&2
fi
# 版本号解析:优先 git tag,其次 .app-version(rsync 到无 .git 的 pad 时使用),
# 最后回退 package.json 里的版本号。与 electron-builder.config.ts / electron.vite.config.ts
# 的解析逻辑保持一致,确保三处版本号(deb 文件名、界面显示、控制文件)永远一致。
VERSION=$(git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//') || true
if [ -z "$VERSION" ] && [ -f .app-version ]; then
VERSION=$(cat .app-version | tr -d '[:space:]' | sed 's/^v//')
fi
if [ -z "$VERSION" ]; then
VERSION=$(node -p "require('./package.json').version")
fi
echo "=== 打包版本号: $VERSION ==="
PRODUCT_NAME="智能电子手册"
EXE_NAME="elec_rag_ui"
PKG_NAME="elec-rag-ui"
APP_DIR="dist/linux-arm64-unpacked"
STAGING="dist/deb-staging"
OUT="dist/${PKG_NAME}_${VERSION}_arm64.deb"
echo "=== 1/4 electron-vite build ==="
npx electron-vite build
cp resources/asr-worker.cjs out/main/asr-worker.cjs
echo "=== 2/4 electron-builder(仅 dir target,跳过 fpm)==="
ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/ \
npx electron-builder --config electron-builder.config.ts --linux dir --arm64
if [ ! -d "$APP_DIR" ]; then
echo "错误:electron-builder 没有产出 $APP_DIR" >&2
exit 1
fi
echo "=== 3/4 手工拼装 deb 结构 ==="
rm -rf "$STAGING"
mkdir -p "$STAGING/DEBIAN" \
"$STAGING/opt/$PRODUCT_NAME" \
"$STAGING/usr/bin" \
"$STAGING/usr/share/applications" \
"$STAGING/usr/share/pixmaps"
cp -a "$APP_DIR/." "$STAGING/opt/$PRODUCT_NAME/"
# chrome-sandbox 必须是 setuid root,否则 Electron 沙箱初始化失败,
# 启动即崩溃报 "Failed sending zygote boot message: 断开的管道"
chmod 4755 "$STAGING/opt/$PRODUCT_NAME/chrome-sandbox"
# 只装 1024x1024 会导致部分桌面菜单(如 UKUI)在按常规尺寸(48x48 等)查找图标时
# 找不到、直接回退成缺省图标,而不是从 1024 缩放——所以要把常规尺寸全部装齐
for size in 16 24 32 48 64 128 256 512 1024; do
mkdir -p "$STAGING/usr/share/icons/hicolor/${size}x${size}/apps"
if [ "$size" = "1024" ]; then
cp resources/icon.png "$STAGING/usr/share/icons/hicolor/1024x1024/apps/$PKG_NAME.png"
else
cp "resources/icons/${size}x${size}.png" "$STAGING/usr/share/icons/hicolor/${size}x${size}/apps/$PKG_NAME.png"
fi
done
# 兼容不认 icon 主题、直接读 pixmaps 的老式菜单实现
cp resources/icons/48x48.png "$STAGING/usr/share/pixmaps/$PKG_NAME.png"
cat > "$STAGING/usr/share/applications/$PKG_NAME.desktop" <<EOF
[Desktop Entry]
Name=$PRODUCT_NAME
Exec=/opt/$PRODUCT_NAME/$EXE_NAME %U
Terminal=false
Type=Application
Icon=$PKG_NAME
StartupWMClass=$PRODUCT_NAME
Comment=RAG 知识库查询桌面应用
Categories=Utility;
EOF
INSTALLED_SIZE=$(du -sk "$STAGING/opt" | cut -f1)
cat > "$STAGING/DEBIAN/control" <<EOF
Package: $PKG_NAME
Version: $VERSION
Section: utils
Priority: optional
Architecture: arm64
Installed-Size: $INSTALLED_SIZE
Depends: libgtk-3-0, libnotify4, libnss3, libxss1, libxtst6, xdg-utils, libatspi2.0-0, libuuid1, libsecret-1-0
Recommends: libappindicator3-1
Maintainer: EdgeRhythm <ssurui@gmail.com>
Homepage: https://gitee.com/EdgeRhythm/elec_rag_ui
Description: 本地化 RAG 问答桌面前端
EOF
cat > "$STAGING/DEBIAN/postinst" <<EOF
#!/bin/sh
set -e
ln -sf "/opt/$PRODUCT_NAME/$EXE_NAME" /usr/bin/$PKG_NAME
if [ -x /usr/bin/update-desktop-database ]; then
update-desktop-database /usr/share/applications >/dev/null 2>&1 || true
fi
if [ -x /usr/bin/gtk-update-icon-cache ]; then
gtk-update-icon-cache -q /usr/share/icons/hicolor >/dev/null 2>&1 || true
fi
EOF
cat > "$STAGING/DEBIAN/postrm" <<EOF
#!/bin/sh
set -e
rm -f /usr/bin/$PKG_NAME
EOF
chmod 755 "$STAGING/DEBIAN/postinst" "$STAGING/DEBIAN/postrm"
echo "=== 4/4 dpkg-deb --build ==="
dpkg-deb --root-owner-group -Zgzip --build "$STAGING" "$OUT"
echo "=== 完成: $OUT ==="
ls -la "$OUT"
dpkg-deb -I "$OUT" | head -20