mirror of
https://github.com/AmintaCCCP/GithubStarsManager.git
synced 2025-11-25 18:47:32 +08:00
0.1.3
This commit is contained in:
231
scripts/update-version.cjs
Normal file
231
scripts/update-version.cjs
Normal 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, '&')
|
||||
.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 <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();
|
||||
Reference in New Issue
Block a user