starmusic-pc
1#!/usr/bin/env node
2/**
3 * 安装包脚本预处理
4 *
5 * NSIS 3 在 `Unicode true` 下读取 .nsi 时:
6 * - 带 UTF-8 BOM → 按 UTF-8 解码(中文正常)
7 * - 不带 BOM → 按系统 ANSI 代码页解码(中文系统上是 GBK,UTF-8 中文会变成乱码)
8 * 本脚本确保 project.nsi 带 BOM,并体检许可协议文件是否会被正确解码。
9 *
10 * 用法:node scripts/prepare-nsis.cjs
11 */
12
13const fs = require('fs')
14const path = require('path')
15
16const INSTALLER_DIR = path.resolve(__dirname, '..', 'build', 'windows', 'installer')
17const NSI = path.join(INSTALLER_DIR, 'project.nsi')
18const LICENSE = path.join(INSTALLER_DIR, 'license.txt')
19
20const BOM = Buffer.from([0xef, 0xbb, 0xbf])
21
22let failed = 0
23
24// ---------- 1. project.nsi 补 BOM ----------
25if (!fs.existsSync(NSI)) {
26 console.error(`✗ 找不到 ${NSI}`)
27 process.exit(1)
28}
29const nsi = fs.readFileSync(NSI)
30const hasBom = nsi.length >= 3 && nsi[0] === 0xef && nsi[1] === 0xbb && nsi[2] === 0xbf
31if (hasBom) {
32 console.log('✓ project.nsi 已带 UTF-8 BOM')
33} else {
34 fs.writeFileSync(NSI, Buffer.concat([BOM, nsi]))
35 console.log('✓ 已为 project.nsi 添加 UTF-8 BOM(中文文案才能正确解码)')
36}
37
38// 确认内容确实是合法 UTF-8(若源文件被以 GBK 保存过,这里会暴露出来)
39const body = fs.readFileSync(NSI).subarray(3).toString('utf8')
40if (body.includes('\uFFFD')) {
41 console.error('✗ project.nsi 不是合法 UTF-8,请用 UTF-8 重新保存该文件')
42 failed++
43} else {
44 const cjk = (body.match(/[\u4e00-\u9fff]/g) || []).length
45 console.log(`✓ project.nsi 为合法 UTF-8,含 ${cjk} 个中文字符`)
46}
47
48// ---------- 2. license.txt 解码体检 ----------
49if (!fs.existsSync(LICENSE)) {
50 console.log('! 未找到 license.txt,安装向导将跳过许可协议页')
51} else {
52 const lic = fs.readFileSync(LICENSE)
53 const licBom = lic.length >= 3 && lic[0] === 0xef && lic[1] === 0xbb && lic[2] === 0xbf
54 let nonAscii = 0
55 for (const b of lic) if (b > 0x7f) nonAscii++
56 console.log(
57 `✓ license.txt:${lic.length} 字节,非 ASCII 字节 ${nonAscii} 个,BOM ${licBom ? '有' : '无'}`
58 )
59 if (nonAscii > 0 && !licBom) {
60 console.log(' ! 含非 ASCII 且无 BOM,许可页的中文/特殊符号可能显示异常(当前为英文 GPL 文本,通常无影响)')
61 }
62}
63
64// ---------- 3. wails_tools.nsh 是否已被 Wails 生成 ----------
65const TOOLS = path.join(INSTALLER_DIR, 'wails_tools.nsh')
66if (fs.existsSync(TOOLS)) {
67 const tools = fs.readFileSync(TOOLS, 'utf8')
68 if (tools.includes('{{')) {
69 console.error('✗ wails_tools.nsh 仍含未替换的 {{模板变量}},请先执行一次 wails build -nsis')
70 failed++
71 } else {
72 console.log('✓ wails_tools.nsh 已由 Wails 生成(模板变量已替换)')
73 }
74} else {
75 console.log('! 尚无 wails_tools.nsh,执行 wails build -nsis 时会自动生成')
76}
77
78console.log('')
79if (failed) {
80 console.error(`预处理失败:${failed} 项问题`)
81 process.exit(1)
82}
83console.log('预处理完成,可以执行 makensis')