From ea1eefe8b84e67b300f85dcdd6eda06046ea9eb2 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Sun, 28 Jun 2026 12:19:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(tools):=20check-cocos-version=20=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E7=89=88=E6=9C=AC=E4=B8=80=E8=87=B4=E6=80=A7=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- .../scripts/check-cocos-version.mjs | 31 ++++++++++++++++++ .../scripts/test/check-cocos-version.test.mjs | 32 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 cocoscreator_projects/scripts/check-cocos-version.mjs create mode 100644 cocoscreator_projects/scripts/test/check-cocos-version.test.mjs diff --git a/cocoscreator_projects/scripts/check-cocos-version.mjs b/cocoscreator_projects/scripts/check-cocos-version.mjs new file mode 100644 index 0000000..4695a1e --- /dev/null +++ b/cocoscreator_projects/scripts/check-cocos-version.mjs @@ -0,0 +1,31 @@ +#!/usr/bin/env node +import { pathToFileURL } from 'node:url'; +import { HOST_PROJECT, GAMES_DIR, readCreatorVersion, listGameProjects } from './lib/paths.mjs'; + +// 比对各子游戏工程与宿主工程的 creator.version +export function checkVersions(hostProject, gamesDir) { + const expected = readCreatorVersion(hostProject); + const mismatches = []; + for (const proj of listGameProjects(gamesDir)) { + const version = readCreatorVersion(proj); + if (version !== expected) { + mismatches.push({ project: proj, version, expected }); + } + } + return { expected, mismatches }; +} + +// CLI 入口:有不一致则退出码 1 +if (import.meta.url === pathToFileURL(process.argv[1]).href) { + const { expected, mismatches } = checkVersions(HOST_PROJECT, GAMES_DIR); + console.log(`宿主 Cocos 版本: ${expected}`); + if (mismatches.length === 0) { + console.log('OK: 所有子游戏工程版本一致。'); + process.exit(0); + } + console.error('版本不一致:'); + for (const m of mismatches) { + console.error(` ${m.project}: ${m.version}(应为 ${m.expected})`); + } + process.exit(1); +} diff --git a/cocoscreator_projects/scripts/test/check-cocos-version.test.mjs b/cocoscreator_projects/scripts/test/check-cocos-version.test.mjs new file mode 100644 index 0000000..edd3076 --- /dev/null +++ b/cocoscreator_projects/scripts/test/check-cocos-version.test.mjs @@ -0,0 +1,32 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { makeTempMonorepo, makeGameProject, cleanup } from './helpers.mjs'; +import { checkVersions } from '../check-cocos-version.mjs'; + +test('checkVersions 全部一致时 mismatches 为空', () => { + const mono = makeTempMonorepo(); + try { + makeGameProject(mono.games, 'a', '3.8.8'); + makeGameProject(mono.games, 'b', '3.8.8'); + const r = checkVersions(mono.host, mono.games); + assert.equal(r.expected, '3.8.8'); + assert.deepEqual(r.mismatches, []); + } finally { + cleanup(mono.root); + } +}); + +test('checkVersions 报告与宿主不一致的工程', () => { + const mono = makeTempMonorepo(); + try { + makeGameProject(mono.games, 'a', '3.8.8'); + makeGameProject(mono.games, 'b', '3.8.6'); + const r = checkVersions(mono.host, mono.games); + assert.equal(r.mismatches.length, 1); + assert.match(r.mismatches[0].project, /[\\/]b$/); + assert.equal(r.mismatches[0].version, '3.8.6'); + assert.equal(r.mismatches[0].expected, '3.8.8'); + } finally { + cleanup(mono.root); + } +});