- C1: 4 个 CLI 脚本守卫加 process.argv[1] 空值短路,避免动态 import 时 pathToFileURL(undefined) 崩溃 - I1: check-cocos-version CLI 在宿主 creator.version 为 null 时报错 exit 1,避免 CI 虚假 OK - M1: scaffold 测试收紧 UUID 正则 - 新增 cli-entry 测试覆盖动态 import 场景 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
41 lines
1.4 KiB
JavaScript
41 lines
1.4 KiB
JavaScript
#!/usr/bin/env node
|
|
import { join } from 'node:path';
|
|
import { pathToFileURL } from 'node:url';
|
|
import { SEED_DIR, GAMES_DIR, FRAMEWORK_SRC } from './lib/paths.mjs';
|
|
import { copySeed, setProjectIdentity, scaffoldGameAssets } from './lib/scaffold.mjs';
|
|
import { ensureJunction } from './lib/junction.mjs';
|
|
|
|
const NAME_RE = /^[a-z0-9][a-z0-9_-]*$/;
|
|
|
|
// 新建一款子游戏工程。opts 可注入路径用于测试。
|
|
export function newGame(name, opts = {}) {
|
|
const seedDir = opts.seedDir ?? SEED_DIR;
|
|
const gamesDir = opts.gamesDir ?? GAMES_DIR;
|
|
const frameworkSrc = opts.frameworkSrc ?? FRAMEWORK_SRC;
|
|
|
|
if (!name || !NAME_RE.test(name)) {
|
|
throw new Error(`非法子游戏名称: "${name}"(仅限小写字母/数字/-/_,且以字母数字开头)`);
|
|
}
|
|
const projectDir = join(gamesDir, name);
|
|
|
|
copySeed(seedDir, projectDir); // 目标已存在会抛错
|
|
setProjectIdentity(projectDir, name);
|
|
scaffoldGameAssets(projectDir, name);
|
|
const link = join(projectDir, 'assets', 'framework');
|
|
ensureJunction(link, frameworkSrc);
|
|
|
|
return { projectDir, link };
|
|
}
|
|
|
|
// CLI 入口
|
|
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
const name = process.argv[2];
|
|
if (!name) {
|
|
console.error('用法: npm run new-game <name>');
|
|
process.exit(1);
|
|
}
|
|
const { projectDir } = newGame(name);
|
|
console.log(`已创建子游戏工程: ${projectDir}`);
|
|
console.log(`下一步: 用 Cocos Creator 打开该目录`);
|
|
}
|