#!/usr/bin/env node /** * 批量重命名构建产物,将文件名中的 "CS工具箱" 改为 "CS_Toolbox" * 用于解决 GitHub releases 不支持中文文件名的问题 * * 使用方法: * node scripts/rename-build-artifacts.js [options] * * 选项: * --target 构建类型(可选,默认 release,可选值:debug、release、fast-release) * --dry-run 仅显示将要重命名的文件,不实际执行 */ const fs = require('fs'); const path = require('path'); // 解析命令行参数 const args = process.argv.slice(2); const getArg = (name, defaultValue = null) => { const index = args.indexOf(name); if (index !== -1 && args[index + 1]) { return args[index + 1]; } return defaultValue; }; const target = getArg('--target', 'release'); const dryRun = args.includes('--dry-run'); // 验证 target 参数 const validTargets = ['debug', 'release', 'fast-release']; if (!validTargets.includes(target)) { console.error(`错误: --target 必须是以下值之一: ${validTargets.join(', ')}`); process.exit(1); } // 根据 target 确定构建产物目录 const bundleDir = path.join(__dirname, '../src-tauri/target', target, 'bundle'); console.log(`使用构建类型: ${target}`); console.log(`构建产物目录: ${bundleDir}`); console.log(dryRun ? '(仅预览模式,不会实际重命名)' : ''); if (!fs.existsSync(bundleDir)) { console.error(`错误: 构建产物目录不存在: ${bundleDir}`); console.error('请先构建应用'); process.exit(1); } // 需要重命名的文件扩展名 const extensions = ['.exe', '.dmg', '.AppImage', '.deb', '.rpm', '.app.tar.gz', '.sig']; // 递归查找并重命名文件 function renameFilesRecursive(dir, maxDepth = 3, currentDepth = 0) { if (!fs.existsSync(dir) || currentDepth > maxDepth) { return []; } const renamedFiles = []; try { const items = fs.readdirSync(dir); for (const item of items) { const itemPath = path.join(dir, item); const stat = fs.statSync(itemPath); if (stat.isFile()) { // 检查文件名是否包含 "CS工具箱" if (item.includes('CS工具箱')) { const newName = item.replace(/CS工具箱/g, 'CS_Toolbox'); const newPath = path.join(dir, newName); // 检查新文件名是否已存在 if (fs.existsSync(newPath) && itemPath !== newPath) { console.warn(` 警告: 目标文件已存在,跳过: ${newName}`); continue; } renamedFiles.push({ oldPath: itemPath, newPath: newPath, oldName: item, newName: newName }); } } else if (stat.isDirectory() && currentDepth < maxDepth) { // 递归查找子目录 const subRenamed = renameFilesRecursive(itemPath, maxDepth, currentDepth + 1); renamedFiles.push(...subRenamed); } } } catch (err) { console.error(`读取目录时出错 ${dir}:`, err.message); } return renamedFiles; } // 查找所有需要重命名的文件 console.log('\n查找需要重命名的文件...'); const filesToRename = renameFilesRecursive(bundleDir); if (filesToRename.length === 0) { console.log('✓ 未找到需要重命名的文件'); process.exit(0); } // 显示将要重命名的文件 console.log(`\n找到 ${filesToRename.length} 个文件需要重命名:\n`); filesToRename.forEach(({ oldName, newName }) => { console.log(` ${oldName}`); console.log(` → ${newName}\n`); }); if (dryRun) { console.log('(预览模式,未实际执行重命名)'); process.exit(0); } // 执行重命名 console.log('执行重命名...'); let successCount = 0; let errorCount = 0; for (const { oldPath, newPath, oldName, newName } of filesToRename) { try { fs.renameSync(oldPath, newPath); console.log(`✓ ${oldName} → ${newName}`); successCount++; } catch (err) { console.error(`✗ 重命名失败 ${oldName}:`, err.message); errorCount++; } } console.log(`\n完成: 成功 ${successCount} 个,失败 ${errorCount} 个`); if (errorCount > 0) { process.exit(1); }