#!/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 '); process.exit(1); } const { projectDir } = newGame(name); console.log(`已创建子游戏工程: ${projectDir}`); console.log(`下一步: 用 Cocos Creator 打开该目录`); }