diff --git a/package-windows-installer.js b/package-windows-installer.js new file mode 100644 index 0000000..ef2516e --- /dev/null +++ b/package-windows-installer.js @@ -0,0 +1,91 @@ +const path = require('path'); +const { execSync } = require('child_process'); +const fs = require('fs'); + +// 创建一个兼容Node.js 12的删除文件夹函数 +function deleteFolderRecursive(dir) { + if (fs.existsSync(dir)) { + const files = fs.readdirSync(dir); + for (let i = 0; i < files.length; i++) { + const file = files[i]; + const curPath = path.join(dir, file); + if (fs.lstatSync(curPath).isDirectory()) { + // 递归删除子文件夹 + deleteFolderRecursive(curPath); + } else { + // 删除文件 + fs.unlinkSync(curPath); + } + } + // 删除空文件夹 + fs.rmdirSync(dir); + } +} + +// 创建打包前的准备工作 +function prepareForBuild() { + console.log('开始准备Windows 7安装版应用打包...'); + + try { + // 清理之前的构建文件 - 使用兼容Node.js 12的方法 + const buildDir = path.join(__dirname, 'dist_electron'); + if (fs.existsSync(buildDir)) { + console.log('清理之前的构建文件...'); + deleteFolderRecursive(buildDir); + } + + // 确保data目录存在 + const dataDir = path.join(__dirname, 'data'); + if (!fs.existsSync(dataDir)) { + fs.mkdirSync(dataDir); + fs.writeFileSync(path.join(dataDir, '.gitignore'), '*\n!.gitignore'); + console.log('创建data目录完成'); + } + + console.log('准备工作完成'); + } catch (error) { + console.error('准备工作失败:', error); + process.exit(1); + } +} + +// 执行打包命令 +function buildInstallerApp() { + console.log('开始构建Windows 7安装版应用...'); + + try { + // 完全删除签名环境变量 + delete process.env.WIN_CSC_LINK; + delete process.env.WIN_CSC_KEY_PASSWORD; + // 设置环境变量明确禁用签名相关功能 + process.env.ELECTRON_BUILDER_SKIP_NOTARIZATION = 'true'; + process.env.ELECTRON_SKIP_NOTARIZE = 'true'; + + // 执行安装包构建命令 + execSync( + 'npm run electron:build -- --win nsis --ia32 --x64 --publish never', + { stdio: 'inherit' } + ); + + console.log('Windows 7安装版应用构建完成!'); + console.log('构建产物位于 dist_electron 目录'); + + } catch (error) { + console.error('构建失败:', error); + process.exit(1); + } +} + +// 主函数 +function main() { + console.log('==== Windows 7安装版应用打包工具 ===='); + console.log('Node.js版本:', process.version); + console.log('Electron版本: 11.5.0'); + console.log('Vue版本: 2.6.11'); + + prepareForBuild(); + buildInstallerApp(); +} + +// 执行主函数 +main(); \ No newline at end of file diff --git a/package.json b/package.json index e77eb3e..d508ca1 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "serve": "vue-cli-service serve", "build": "vue-cli-service build", "build:win7-portable": "node package-windows-portable.js", + "build:win7-installer": "node package-windows-installer.js", "electron:build": "vue-cli-service electron:build", "electron:serve": "vue-cli-service electron:serve", "postinstall": "electron-builder install-app-deps", diff --git a/vue.config.js b/vue.config.js index 25140c4..554f0a8 100644 --- a/vue.config.js +++ b/vue.config.js @@ -62,12 +62,16 @@ module.exports = { // Windows构建配置 - 修改输出目录结构 win: { - // 架构设置 + // 架构设置 - 添加nsis安装包类型 target: [ { target: "portable", arch: ["ia32", "x64"], }, + { + target: "nsis", + arch: ["ia32", "x64"], + } ], icon: "public/favicon.ico", // 明确禁用签名的多种配置 @@ -91,6 +95,28 @@ module.exports = { ], }, + // 添加nsis安装包特定配置 + nsis: { + // 安装包名称 + artifactName: "installer/StatExamInstaller_${version}_${arch}.exe", + // 一键安装 + oneClick: false, + // 允许用户选择安装目录 + allowToChangeInstallationDirectory: true, + // 安装图标 + installerIcon: "public/favicon.ico", + // 卸载图标 + uninstallerIcon: "public/favicon.ico", + // 安装完毕后运行程序 + runAfterFinish: true, + // 包含中文语言支持 + include: "build/installer.nsh", + // 定义安装目录名 + shortcutName: "统计技能考试系统", + // 开始菜单文件夹名称 + startMenuCategory: "统计技能考试系统", + }, + // 便携应用特定配置 - 修改输出结构 portable: { // 使用更简单的文件名,避免编码问题