#!/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 = '\n\n';
}
// 生成下载链接
const downloadUrl = customDownloadUrl ||
`https://github.com/AmintaCCCP/GithubStarsManager/releases/download/v${version}/github-stars-manager-${version}.dmg`;
// 解析现有的XML
const versionEntry = `
${version}
${currentDate}
${changelog.map(item => ` - ${escapeXml(item)}
`).join('\n')}
${escapeXml(downloadUrl)}
`;
// 在 前插入新版本
const updatedXml = xmlContent.replace('', `${versionEntry}\n`);
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, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
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 [--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(' 版本号,格式为 x.y.z');
console.log(' 更新日志,至少需要一条');
console.log(' --url= 自定义下载链接(可选)');
console.log('');
console.log('注意:');
console.log(' • 版本号必须遵循 x.y.z 格式');
console.log(' • 更新日志至少需要一条');
console.log(' • 如果不指定 --url,将使用默认的 GitHub Release 链接格式');
console.log(' • 更新后记得提交到Git仓库');
}
// 运行脚本
updateVersionInfo();