This commit is contained in:
AmintaCCCP
2025-08-03 16:49:39 +08:00
parent edb68290c9
commit 682695f1d1
14 changed files with 1184 additions and 23 deletions

231
scripts/update-version.cjs Normal file
View File

@@ -0,0 +1,231 @@
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
/**
* 更新版本信息的脚本
* 使用方法:
* node scripts/update-version.cjs [version] [changelog...] [--url=downloadUrl]
* node scripts/update-version.cjs --list (列出所有版本)
* node scripts/update-version.cjs --current (显示当前版本)
*
* 例如:
* node scripts/update-version.cjs 0.1.3 "修复搜索bug" "添加新功能"
* node scripts/update-version.cjs 0.1.3 "修复bug" --url="https://github.com/AmintaCCCP/GithubStarsManager/releases/tag/v0.1.3-fix"
*/
function updateVersionInfo() {
const args = process.argv.slice(2);
// 处理特殊命令
if (args.length === 1) {
if (args[0] === '--list') {
listVersions();
return;
}
if (args[0] === '--current') {
showCurrentVersion();
return;
}
if (args[0] === '--help' || args[0] === '-h') {
showHelp();
return;
}
}
if (args.length < 2) {
console.error('❌ 参数不足');
showHelp();
process.exit(1);
}
const newVersion = args[0];
// 解析参数,查找自定义下载链接
let customDownloadUrl = null;
const changelog = [];
for (let i = 1; i < args.length; i++) {
const arg = args[i];
if (arg.startsWith('--url=')) {
customDownloadUrl = arg.substring(6);
} else {
changelog.push(arg);
}
}
// 验证版本号格式
if (!/^\d+\.\d+\.\d+$/.test(newVersion)) {
console.error('❌ 版本号格式错误,应该是 x.y.z 格式');
process.exit(1);
}
// 验证至少有一条更新日志
if (changelog.length === 0) {
console.error('❌ 至少需要提供一条更新日志');
process.exit(1);
}
try {
// 更新 package.json
updatePackageJson(newVersion);
// 更新 version-info.xml
updateVersionXML(newVersion, changelog, customDownloadUrl);
// 更新 UpdateService 中的版本号
updateServiceVersion(newVersion);
console.log(`✅ 版本已更新到 ${newVersion}`);
console.log('📝 更新内容:');
changelog.forEach((item, index) => {
console.log(` ${index + 1}. ${item}`);
});
if (customDownloadUrl) {
console.log(`🔗 自定义下载链接: ${customDownloadUrl}`);
}
console.log('\n🔄 请记得提交这些更改到 Git 仓库');
} catch (error) {
console.error('❌ 更新版本失败:', error.message);
process.exit(1);
}
}
function updatePackageJson(version) {
const packagePath = path.join(__dirname, '../package.json');
const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
packageJson.version = version;
fs.writeFileSync(packagePath, JSON.stringify(packageJson, null, 2) + '\n');
console.log(`📦 已更新 package.json 版本到 ${version}`);
}
function updateVersionXML(version, changelog, customDownloadUrl) {
const xmlPath = path.join(__dirname, '../versions/version-info.xml');
const currentDate = new Date().toISOString().split('T')[0];
let xmlContent;
try {
xmlContent = fs.readFileSync(xmlPath, 'utf8');
} catch (error) {
// 如果文件不存在创建新的XML文件
xmlContent = '<?xml version="1.0" encoding="UTF-8"?>\n<versions>\n</versions>';
}
// 生成下载链接
const downloadUrl = customDownloadUrl ||
`https://github.com/AmintaCCCP/GithubStarsManager/releases/download/v${version}/github-stars-manager-${version}.dmg`;
// 解析现有的XML
const versionEntry = ` <version>
<number>${version}</number>
<releaseDate>${currentDate}</releaseDate>
<changelog>
${changelog.map(item => ` <item>${escapeXml(item)}</item>`).join('\n')}
</changelog>
<downloadUrl>${escapeXml(downloadUrl)}</downloadUrl>
</version>`;
// 在 </versions> 前插入新版本
const updatedXml = xmlContent.replace('</versions>', `${versionEntry}\n</versions>`);
fs.writeFileSync(xmlPath, updatedXml);
console.log(`📄 已更新 version-info.xml`);
}
function updateServiceVersion(version) {
const servicePath = path.join(__dirname, '../src/services/updateService.ts');
let serviceContent = fs.readFileSync(servicePath, 'utf8');
// 更新版本号
serviceContent = serviceContent.replace(
/return '\d+\.\d+\.\d+';/,
`return '${version}';`
);
fs.writeFileSync(servicePath, serviceContent);
console.log(`🔧 已更新 UpdateService 版本到 ${version}`);
}
function escapeXml(text) {
return text
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&apos;');
}
function listVersions() {
const xmlPath = path.join(__dirname, '../versions/version-info.xml');
try {
const xmlContent = fs.readFileSync(xmlPath, 'utf8');
const parser = require('xml2js');
parser.parseString(xmlContent, (err, result) => {
if (err) {
console.error('❌ XML解析失败:', err.message);
return;
}
const versions = result.versions.version || [];
console.log('📋 版本历史:');
console.log('');
versions.forEach((version, index) => {
console.log(`${index + 1}. v${version.number[0]} (${version.releaseDate[0]})`);
if (version.changelog && version.changelog[0].item) {
version.changelog[0].item.forEach(item => {
console.log(`${item}`);
});
}
console.log('');
});
});
} catch (error) {
console.error('❌ 读取版本信息失败:', error.message);
}
}
function showCurrentVersion() {
try {
const packagePath = path.join(__dirname, '../package.json');
const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
console.log(`📦 当前版本: v${packageJson.version}`);
} catch (error) {
console.error('❌ 读取当前版本失败:', error.message);
}
}
function showHelp() {
console.log('📖 版本管理工具使用说明');
console.log('');
console.log('用法:');
console.log(' node scripts/update-version.cjs <version> <changelog...> [--url=downloadUrl]');
console.log(' node scripts/update-version.cjs --list 列出所有版本');
console.log(' node scripts/update-version.cjs --current 显示当前版本');
console.log(' node scripts/update-version.cjs --help 显示帮助');
console.log('');
console.log('示例:');
console.log(' node scripts/update-version.cjs 0.1.3 "修复搜索bug" "添加新功能"');
console.log(' node scripts/update-version.cjs 0.1.4 "优化性能" --url="https://github.com/AmintaCCCP/GithubStarsManager/releases/tag/v0.1.4-fix"');
console.log(' npm run update-version 0.1.5 "修复已知问题" "提升用户体验"');
console.log('');
console.log('参数说明:');
console.log(' <version> 版本号,格式为 x.y.z');
console.log(' <changelog...> 更新日志,至少需要一条');
console.log(' --url=<url> 自定义下载链接(可选)');
console.log('');
console.log('注意:');
console.log(' • 版本号必须遵循 x.y.z 格式');
console.log(' • 更新日志至少需要一条');
console.log(' • 如果不指定 --url将使用默认的 GitHub Release 链接格式');
console.log(' • 更新后记得提交到Git仓库');
}
// 运行脚本
updateVersionInfo();