// 从 public/favicon.svg 派生 Tauri 需要的各尺寸 PNG 图标 // 用法: node scripts/generate-icons.mjs // 一次性脚本, 生成的图标随仓库提交, 不需要每次都跑 import sharp from 'sharp' import path from 'node:path' import fs from 'node:fs' const SVG = path.join(process.cwd(), 'public', 'favicon.svg') const OUT = path.join(process.cwd(), 'src-tauri', 'icons') fs.mkdirSync(OUT, { recursive: true }) const svg = fs.readFileSync(SVG) const base = sharp(svg) // Tauri 桌面 + Android 需要的尺寸 const TARGETS = [ { name: '32x32.png', size: 32 }, { name: '128x128.png', size: 128 }, { name: '128x128@2x.png', size: 256 }, { name: 'icon.png', size: 1024 }, ] for (const t of TARGETS) { const buf = await base.clone().resize(t.size, t.size).png().toBuffer() fs.writeFileSync(path.join(OUT, t.name), buf) console.log('wrote', t.name, t.size + 'x' + t.size) } // Windows .ico (单 256x256 frame, 简单够用) const ico = await sharp(svg).resize(256, 256).png().toBuffer() fs.writeFileSync(path.join(OUT, 'icon.ico'), ico) console.log('wrote icon.ico (256x256 PNG-as-ICO)') // macOS .icns: TaurCli 可用 png2icns 工具, 这里只放占位 // 如果未来要打 macOS DMG, 跑 cargo tauri icon 重新生成 fs.copyFileSync(path.join(OUT, 'icon.png'), path.join(OUT, 'icon.icns')) console.log('wrote icon.icns (copy of icon.png, run cargo tauri icon to replace)')