win7-portable

This commit is contained in:
chenqiang 2025-09-09 02:43:41 +08:00
parent c9f6062258
commit 431dfaa45d
4 changed files with 161 additions and 1 deletions

View File

@ -0,0 +1,87 @@
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
// 创建一个兼容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 buildPortableApp() {
console.log('开始构建Windows 7便携应用...');
try {
// 设置构建环境变量
process.env.WIN_CSC_LINK = '';
process.env.WIN_CSC_KEY_PASSWORD = '';
// 执行构建命令 - 特别针对Windows 7优化兼容Electron 11
execSync(
'npm run electron:build -- --win portable --ia32 --x64 --no-compress --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();
buildPortableApp();
}
// 执行主函数
main();

View File

@ -6,6 +6,7 @@
"start": "vue-cli-service electron:serve",
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"build:win7-portable": "node package-windows-portable.js",
"electron:build": "vue-cli-service electron:build",
"electron:serve": "vue-cli-service electron:serve",
"postinstall": "electron-builder install-app-deps",

View File

@ -7,6 +7,7 @@ const bcrypt = require('bcryptjs')
const isDevelopment = process.env.NODE_ENV !== 'production'
// 导入fs模块用于文件操作
const fs = require('fs')
const path = require('path')
// 导入数据库相关函数
const { checkDatabaseInitialized, initializeDatabase, initializeUserDatabase } = require('./db/index.js');
@ -280,3 +281,43 @@ ipcMain.handle('initializeUserDatabaseSilently', async () => {
return { success: false, error: error.message }
}
})
// 检测是否为便携模式运行
let isPortableMode = false
let appDataPath = ''
// 初始化应用路径 - 兼容Node.js 12
function initializeAppPaths() {
// 检查应用根目录是否存在data文件夹如果存在则认为是便携模式
const portableDataPath = path.join(process.cwd(), 'data')
const defaultDataPath = path.join(app.getPath('userData'), 'data')
// 检查是否为便携模式
if (fs.existsSync(portableDataPath)) {
isPortableMode = true
appDataPath = portableDataPath
console.log('检测到便携模式使用当前目录的data文件夹:', appDataPath)
} else {
isPortableMode = false
appDataPath = defaultDataPath
console.log('使用默认数据目录:', appDataPath)
// 确保默认数据目录存在
if (!fs.existsSync(appDataPath)) {
fs.mkdirSync(appDataPath, { recursive: true })
}
}
}
// 添加全局函数获取数据目录
global.getAppDataPath = function() {
return appDataPath
}
global.isPortableMode = function() {
return isPortableMode
}
// 在应用ready事件前初始化路径
initializeAppPaths()

View File

@ -32,7 +32,7 @@ module.exports = {
})
.end()
// 添加对mjs文件的处理
// 添加对mjs文件的处理 - 兼容Electron 11
config.module
.rule('mjs')
.test(/\.mjs$/)
@ -40,6 +40,37 @@ module.exports = {
.add(/node_modules/)
.end()
.type('javascript/auto')
},
// Windows 7便携应用配置 - 兼容Electron 11
win: {
target: [
{
target: 'portable',
arch: ['ia32', 'x64']
}
],
icon: 'public/favicon.ico',
// 关闭压缩以提高在Windows 7上的兼容性
compression: 'store',
// 针对Windows 7的特殊配置
extraResources: [
{
from: 'src/background/font',
to: 'font',
filter: ['**/*']
},
{
from: 'data',
to: 'data',
filter: ['.gitignore']
}
]
},
// 便携应用配置 - 兼容Electron 11
portable: {
artifactName: '统计技能考试系统_便携版_${version}_${arch}.exe',
// 启用便携模式标志
target: 'portable'
}
}
}