fix: 完善桌面应用图标打包
统一 macOS 图标命名为 icon.icns。\n补充 Linux hicolor 图标资源。\n修复 Windows make 构建兼容性并为 exe 嵌入图标资源。\n清理旧版图标说明与不再使用的 SVG 源文件。
1
.gitignore
vendored
@@ -412,3 +412,4 @@ skills-lock.json
|
|||||||
# Embedfs generated
|
# Embedfs generated
|
||||||
embedfs/assets/
|
embedfs/assets/
|
||||||
embedfs/frontend-dist/
|
embedfs/frontend-dist/
|
||||||
|
backend/cmd/desktop/rsrc_windows_*.syso
|
||||||
|
|||||||
43
Makefile
@@ -6,7 +6,7 @@
|
|||||||
frontend-build frontend-dev frontend-test frontend-test-watch frontend-test-coverage frontend-test-e2e frontend-lint frontend-clean \
|
frontend-build frontend-dev frontend-test frontend-test-watch frontend-test-coverage frontend-test-e2e frontend-lint frontend-clean \
|
||||||
desktop-build desktop-build-mac desktop-build-win desktop-build-linux \
|
desktop-build desktop-build-mac desktop-build-win desktop-build-linux \
|
||||||
desktop-dev desktop-test desktop-clean \
|
desktop-dev desktop-test desktop-clean \
|
||||||
desktop-prepare-frontend desktop-prepare-embedfs
|
desktop-prepare-frontend desktop-prepare-embedfs desktop-prepare-windows-resource
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# 顶层便捷命令
|
# 顶层便捷命令
|
||||||
@@ -158,15 +158,40 @@ desktop-build: desktop-build-mac desktop-build-win desktop-build-linux
|
|||||||
|
|
||||||
desktop-prepare-frontend:
|
desktop-prepare-frontend:
|
||||||
@echo "📦 Preparing frontend for desktop..."
|
@echo "📦 Preparing frontend for desktop..."
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
powershell -NoProfile -Command "Copy-Item -LiteralPath 'frontend/.env.desktop' -Destination 'frontend/.env.production.local' -Force"
|
||||||
|
cd frontend && bun install && bun run build
|
||||||
|
powershell -NoProfile -Command "Remove-Item -LiteralPath 'frontend/.env.production.local' -Force -ErrorAction SilentlyContinue"
|
||||||
|
else
|
||||||
cd frontend && cp .env.desktop .env.production.local
|
cd frontend && cp .env.desktop .env.production.local
|
||||||
cd frontend && bun install && bun run build
|
cd frontend && bun install && bun run build
|
||||||
rm -f frontend/.env.production.local
|
rm -f frontend/.env.production.local
|
||||||
|
endif
|
||||||
|
|
||||||
desktop-prepare-embedfs:
|
desktop-prepare-embedfs:
|
||||||
@echo "📦 Preparing embedded filesystem..."
|
@echo "📦 Preparing embedded filesystem..."
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
powershell -NoProfile -Command "Remove-Item -LiteralPath 'embedfs/assets' -Recurse -Force -ErrorAction SilentlyContinue; Remove-Item -LiteralPath 'embedfs/frontend-dist' -Recurse -Force -ErrorAction SilentlyContinue; Copy-Item -LiteralPath 'assets' -Destination 'embedfs/assets' -Recurse; Copy-Item -LiteralPath 'frontend/dist' -Destination 'embedfs/frontend-dist' -Recurse"
|
||||||
|
else
|
||||||
rm -rf embedfs/assets embedfs/frontend-dist
|
rm -rf embedfs/assets embedfs/frontend-dist
|
||||||
cp -r assets embedfs/assets
|
cp -r assets embedfs/assets
|
||||||
cp -r frontend/dist embedfs/frontend-dist
|
cp -r frontend/dist embedfs/frontend-dist
|
||||||
|
endif
|
||||||
|
|
||||||
|
desktop-prepare-windows-resource:
|
||||||
|
@echo "📦 Preparing Windows executable icon..."
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
cd backend/cmd/desktop && windres -O coff -F pe-x86-64 -i icon_windows.rc -o rsrc_windows_amd64.syso
|
||||||
|
else
|
||||||
|
@if command -v x86_64-w64-mingw32-windres >/dev/null 2>&1; then \
|
||||||
|
cd backend/cmd/desktop && x86_64-w64-mingw32-windres -O coff -F pe-x86-64 -i icon_windows.rc -o rsrc_windows_amd64.syso; \
|
||||||
|
elif command -v windres >/dev/null 2>&1; then \
|
||||||
|
cd backend/cmd/desktop && windres -O coff -F pe-x86-64 -i icon_windows.rc -o rsrc_windows_amd64.syso; \
|
||||||
|
else \
|
||||||
|
echo "❌ 未找到 windres,无法生成 Windows exe 图标资源"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
endif
|
||||||
|
|
||||||
desktop-build-mac: desktop-prepare-frontend desktop-prepare-embedfs
|
desktop-build-mac: desktop-prepare-frontend desktop-prepare-embedfs
|
||||||
@echo "🍎 Building macOS..."
|
@echo "🍎 Building macOS..."
|
||||||
@@ -176,10 +201,10 @@ desktop-build-mac: desktop-prepare-frontend desktop-prepare-embedfs
|
|||||||
@echo "📦 Packaging macOS .app..."
|
@echo "📦 Packaging macOS .app..."
|
||||||
mkdir -p build/Nex.app/Contents/MacOS build/Nex.app/Contents/Resources
|
mkdir -p build/Nex.app/Contents/MacOS build/Nex.app/Contents/Resources
|
||||||
cp build/nex-mac-universal build/Nex.app/Contents/MacOS/nex
|
cp build/nex-mac-universal build/Nex.app/Contents/MacOS/nex
|
||||||
@if [ -f assets/AppIcon.icns ]; then \
|
@if [ -f assets/icon.icns ]; then \
|
||||||
cp assets/AppIcon.icns build/Nex.app/Contents/Resources/; \
|
cp assets/icon.icns build/Nex.app/Contents/Resources/; \
|
||||||
else \
|
else \
|
||||||
echo "⚠️ 未找到 assets/AppIcon.icns"; \
|
echo "⚠️ 未找到 assets/icon.icns"; \
|
||||||
fi
|
fi
|
||||||
@MIN_MACOS_VERSION=$$(vtool -show-build build/nex-mac-universal | awk '/minos / {print $$2; exit}'); \
|
@MIN_MACOS_VERSION=$$(vtool -show-build build/nex-mac-universal | awk '/minos / {print $$2; exit}'); \
|
||||||
if [ -z "$$MIN_MACOS_VERSION" ]; then \
|
if [ -z "$$MIN_MACOS_VERSION" ]; then \
|
||||||
@@ -196,7 +221,7 @@ desktop-build-mac: desktop-prepare-frontend desktop-prepare-embedfs
|
|||||||
' <key>CFBundleExecutable</key>' \
|
' <key>CFBundleExecutable</key>' \
|
||||||
' <string>nex</string>' \
|
' <string>nex</string>' \
|
||||||
' <key>CFBundleIconFile</key>' \
|
' <key>CFBundleIconFile</key>' \
|
||||||
' <string>AppIcon</string>' \
|
' <string>icon</string>' \
|
||||||
' <key>CFBundleIdentifier</key>' \
|
' <key>CFBundleIdentifier</key>' \
|
||||||
' <string>com.lanyuanxiaoyao.nex</string>' \
|
' <string>com.lanyuanxiaoyao.nex</string>' \
|
||||||
' <key>CFBundleInfoDictionaryVersion</key>' \
|
' <key>CFBundleInfoDictionaryVersion</key>' \
|
||||||
@@ -227,9 +252,15 @@ desktop-build-mac: desktop-prepare-frontend desktop-prepare-embedfs
|
|||||||
chmod +x build/Nex.app/Contents/MacOS/nex
|
chmod +x build/Nex.app/Contents/MacOS/nex
|
||||||
@echo "✅ macOS app packaged: build/Nex.app"
|
@echo "✅ macOS app packaged: build/Nex.app"
|
||||||
|
|
||||||
desktop-build-win: desktop-prepare-frontend desktop-prepare-embedfs
|
desktop-build-win: desktop-prepare-frontend desktop-prepare-embedfs desktop-prepare-windows-resource
|
||||||
@echo "🪟 Building Windows..."
|
@echo "🪟 Building Windows..."
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
powershell -NoProfile -Command "New-Item -ItemType Directory -Path 'build' -Force | Out-Null"
|
||||||
|
cd backend && set "CGO_ENABLED=1"&& set "GOOS=windows"&& set "GOARCH=amd64"&& go build -ldflags "-H=windowsgui" -o ../build/nex-win-amd64.exe ./cmd/desktop
|
||||||
|
else
|
||||||
|
mkdir -p build
|
||||||
cd backend && CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -ldflags "-H=windowsgui" -o ../build/nex-win-amd64.exe ./cmd/desktop
|
cd backend && CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -ldflags "-H=windowsgui" -o ../build/nex-win-amd64.exe ./cmd/desktop
|
||||||
|
endif
|
||||||
|
|
||||||
desktop-build-linux: desktop-prepare-frontend desktop-prepare-embedfs
|
desktop-build-linux: desktop-prepare-frontend desktop-prepare-embedfs
|
||||||
@echo "🐧 Building Linux..."
|
@echo "🐧 Building Linux..."
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ nex/
|
|||||||
│
|
│
|
||||||
├── assets/ # 应用资源
|
├── assets/ # 应用资源
|
||||||
│ ├── icon.png # 托盘图标
|
│ ├── icon.png # 托盘图标
|
||||||
│ ├── AppIcon.icns # macOS 应用图标
|
│ ├── icon.icns # macOS 应用图标
|
||||||
│ └── icon.ico # Windows 应用图标
|
│ └── icon.ico # Windows 应用图标
|
||||||
│
|
│
|
||||||
└── README.md # 本文件
|
└── README.md # 本文件
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
# Assets
|
|
||||||
|
|
||||||
应用资源文件目录。
|
|
||||||
|
|
||||||
## 文件说明
|
|
||||||
|
|
||||||
| 文件 | 用途 | 尺寸 | 格式 |
|
|
||||||
|------|------|------|------|
|
|
||||||
| `icon.svg` | 源图标 | 64x64 | SVG |
|
|
||||||
| `icon.png` | 托盘图标 | 64x64 | PNG |
|
|
||||||
| `AppIcon.icns` | macOS 应用图标 | 多尺寸 | ICNS |
|
|
||||||
| `icon.ico` | Windows 应用图标 | 256x256 | ICO |
|
|
||||||
|
|
||||||
## 替换图标
|
|
||||||
|
|
||||||
### 1. 准备图标
|
|
||||||
|
|
||||||
推荐使用 SVG 格式的源图标,尺寸至少 256x256。
|
|
||||||
|
|
||||||
### 2. 生成各平台图标
|
|
||||||
|
|
||||||
**托盘图标 (PNG)**:
|
|
||||||
```bash
|
|
||||||
magick your-icon.svg -resize 64x64 icon.png
|
|
||||||
```
|
|
||||||
|
|
||||||
**macOS 应用图标 (ICNS)**:
|
|
||||||
```bash
|
|
||||||
mkdir icon.iconset
|
|
||||||
magick your-icon.svg -resize 16x16 icon.iconset/icon_16x16.png
|
|
||||||
magick your-icon.svg -resize 32x32 icon.iconset/icon_16x16@2x.png
|
|
||||||
magick your-icon.svg -resize 32x32 icon.iconset/icon_32x32.png
|
|
||||||
magick your-icon.svg -resize 64x64 icon.iconset/icon_32x32@2x.png
|
|
||||||
magick your-icon.svg -resize 128x128 icon.iconset/icon_128x128.png
|
|
||||||
magick your-icon.svg -resize 256x256 icon.iconset/icon_128x128@2x.png
|
|
||||||
iconutil -c icns icon.iconset -o AppIcon.icns
|
|
||||||
rm -rf icon.iconset
|
|
||||||
```
|
|
||||||
|
|
||||||
**Windows 应用图标 (ICO)**:
|
|
||||||
```bash
|
|
||||||
magick your-icon.svg -resize 256x256 icon.ico
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 替换文件
|
|
||||||
|
|
||||||
将生成的文件放入此目录,然后重新构建桌面应用:
|
|
||||||
```bash
|
|
||||||
./scripts/build/build-darwin-arm64.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## macOS Template 图标
|
|
||||||
|
|
||||||
macOS 支持 Template 图标,自动适配深浅色模式:
|
|
||||||
- 使用黑色 + 透明设计
|
|
||||||
- 文件名以 `Template` 结尾(如 `iconTemplate.png`)
|
|
||||||
- 黑色在深色模式下自动变为白色
|
|
||||||
|
|
||||||
## 设计建议
|
|
||||||
|
|
||||||
- 托盘图标应简洁,在小尺寸下清晰可辨
|
|
||||||
- 避免过多细节和文字
|
|
||||||
- 使用高对比度颜色
|
|
||||||
- macOS 建议使用 Template 图标风格
|
|
||||||
BIN
assets/icon.icns
Normal file
BIN
assets/icon.ico
|
Before Width: | Height: | Size: 264 KiB After Width: | Height: | Size: 73 KiB |
BIN
assets/icon.png
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 948 KiB |
@@ -1,13 +0,0 @@
|
|||||||
<svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect width="64" height="64" rx="12" fill="#4A90D9"/>
|
|
||||||
<polygon points="32,8 52,20 52,44 32,56 12,44 12,20" fill="none" stroke="white" stroke-width="3"/>
|
|
||||||
<circle cx="32" cy="32" r="6" fill="white"/>
|
|
||||||
<line x1="32" y1="32" x2="20" y2="20" stroke="white" stroke-width="2"/>
|
|
||||||
<line x1="32" y1="32" x2="44" y2="20" stroke="white" stroke-width="2"/>
|
|
||||||
<line x1="32" y1="32" x2="20" y2="44" stroke="white" stroke-width="2"/>
|
|
||||||
<line x1="32" y1="32" x2="44" y2="44" stroke="white" stroke-width="2"/>
|
|
||||||
<circle cx="20" cy="20" r="3" fill="white"/>
|
|
||||||
<circle cx="44" cy="20" r="3" fill="white"/>
|
|
||||||
<circle cx="20" cy="44" r="3" fill="white"/>
|
|
||||||
<circle cx="44" cy="44" r="3" fill="white"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 779 B |
BIN
assets/icons/hicolor/128x128/apps/nex.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
assets/icons/hicolor/16x16/apps/nex.png
Normal file
|
After Width: | Height: | Size: 718 B |
BIN
assets/icons/hicolor/22x22/apps/nex.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
assets/icons/hicolor/24x24/apps/nex.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
assets/icons/hicolor/256x256/apps/nex.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
assets/icons/hicolor/32x32/apps/nex.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
assets/icons/hicolor/48x48/apps/nex.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
assets/icons/hicolor/512x512/apps/nex.png
Normal file
|
After Width: | Height: | Size: 182 KiB |
BIN
assets/icons/hicolor/64x64/apps/nex.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
1
backend/cmd/desktop/icon_windows.rc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1 ICON "../../../assets/icon.ico"
|
||||||