diff --git a/cocoscreator_projects/scripts/bump-cocos.mjs b/cocoscreator_projects/scripts/bump-cocos.mjs new file mode 100644 index 0000000..d602170 --- /dev/null +++ b/cocoscreator_projects/scripts/bump-cocos.mjs @@ -0,0 +1,35 @@ +#!/usr/bin/env node +import { join } from 'node:path'; +import { readFileSync, writeFileSync } from 'node:fs'; +import { pathToFileURL } from 'node:url'; +import { HOST_PROJECT, GAMES_DIR, listGameProjects } from './lib/paths.mjs'; + +// 批量把若干工程的 creator.version 改为 version,返回每个工程的 from/to +export function bumpVersion(projectDirs, version) { + const changed = []; + for (const dir of projectDirs) { + const pkgPath = join(dir, 'package.json'); + const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')); + if (!pkg.creator) pkg.creator = {}; + const from = pkg.creator.version ?? null; + pkg.creator.version = version; + writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n'); + changed.push({ dir, from, to: version }); + } + return changed; +} + +// CLI 入口:bump 宿主 + 所有子游戏到指定版本 +if (import.meta.url === pathToFileURL(process.argv[1]).href) { + const version = process.argv[2]; + if (!version) { + console.error('用法: npm run bump-cocos 例: npm run bump-cocos 3.8.9'); + process.exit(1); + } + const targets = [HOST_PROJECT, ...listGameProjects(GAMES_DIR)]; + const changed = bumpVersion(targets, version); + for (const c of changed) { + console.log(`${c.dir}: ${c.from} → ${c.to}`); + } + console.log('\n⚠️ 仍需用新版 Cocos Creator 逐个打开各工程执行迁移(library 重建)。'); +} diff --git a/cocoscreator_projects/scripts/test/bump-cocos.test.mjs b/cocoscreator_projects/scripts/test/bump-cocos.test.mjs new file mode 100644 index 0000000..7965c9e --- /dev/null +++ b/cocoscreator_projects/scripts/test/bump-cocos.test.mjs @@ -0,0 +1,36 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { join } from 'node:path'; +import { readFileSync, writeFileSync } from 'node:fs'; +import { makeTempMonorepo, makeGameProject, cleanup } from './helpers.mjs'; +import { bumpVersion } from '../bump-cocos.mjs'; + +test('bumpVersion 改写各工程 creator.version 并报告 from/to', () => { + const mono = makeTempMonorepo(); + try { + const a = makeGameProject(mono.games, 'a', '3.8.8'); + const changed = bumpVersion([mono.host, a], '3.8.9'); + assert.equal(changed.length, 2); + assert.equal(changed[1].from, '3.8.8'); + assert.equal(changed[1].to, '3.8.9'); + const pkgA = JSON.parse(readFileSync(join(a, 'package.json'), 'utf8')); + assert.equal(pkgA.creator.version, '3.8.9'); + const pkgHost = JSON.parse(readFileSync(join(mono.host, 'package.json'), 'utf8')); + assert.equal(pkgHost.creator.version, '3.8.9'); + } finally { + cleanup(mono.root); + } +}); + +test('bumpVersion 对缺 creator 字段的工程补建后写入', () => { + const mono = makeTempMonorepo(); + try { + const a = makeGameProject(mono.games, 'a', '3.8.8'); + writeFileSync(join(a, 'package.json'), JSON.stringify({ name: 'a' })); + bumpVersion([a], '3.8.9'); + const pkgA = JSON.parse(readFileSync(join(a, 'package.json'), 'utf8')); + assert.equal(pkgA.creator.version, '3.8.9'); + } finally { + cleanup(mono.root); + } +});