Close DDD refactor and remove generated asset proxy
This commit is contained in:
@@ -55,7 +55,7 @@ for (const target of selectedTargets) {
|
||||
await recreateTempDir(tempOutDir);
|
||||
|
||||
console.log(`[spacetime:generate] 生成 ${target.name} bindings 到短路径: ${tempOutDir}`);
|
||||
await run('spacetime', buildGenerateArgs(target, tempOutDir));
|
||||
await generateBindings(target, tempOutDir);
|
||||
|
||||
const fileCount = await countFiles(tempOutDir);
|
||||
if (fileCount === 0) {
|
||||
@@ -141,7 +141,79 @@ function buildGenerateArgs(target, outDir) {
|
||||
return generateArgs;
|
||||
}
|
||||
|
||||
function run(command, commandArgs) {
|
||||
async function generateBindings(target, outDir) {
|
||||
const result = await run('spacetime', buildGenerateArgs(target, outDir), {
|
||||
allowGeneratedFormatFailure: target.lang === 'rust',
|
||||
});
|
||||
|
||||
if (result.generatedFormatFailed) {
|
||||
// Windows 下 SpacetimeDB CLI 2.1.0 会把所有 Rust 文件一次性传给 formatter;
|
||||
// 这里只接管“文件已生成但 CLI 格式化失败”的尾段,并仍然只同步生成目录。
|
||||
console.warn(
|
||||
`[spacetime:generate] ${target.name} bindings 已生成,但 SpacetimeDB CLI 自带格式化失败;改用短路径分批 rustfmt。`,
|
||||
);
|
||||
await formatRustBindings(outDir);
|
||||
}
|
||||
}
|
||||
|
||||
async function formatRustBindings(outDir) {
|
||||
const rustFiles = await collectRustFiles(outDir);
|
||||
if (rustFiles.length === 0) {
|
||||
throw new Error(`Rust bindings 未生成任何 .rs 文件,无法格式化: ${outDir}`);
|
||||
}
|
||||
|
||||
for (const chunk of chunkCommandArgs(rustFiles)) {
|
||||
await run('rustfmt', ['--edition', '2024', ...chunk]);
|
||||
}
|
||||
}
|
||||
|
||||
async function collectRustFiles(dir) {
|
||||
const files = [];
|
||||
const entries = await readdir(dir, {withFileTypes: true});
|
||||
|
||||
for (const entry of entries) {
|
||||
const entryPath = path.join(dir, entry.name);
|
||||
|
||||
if (entry.isDirectory()) {
|
||||
files.push(...(await collectRustFiles(entryPath)));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (entry.isFile() && entry.name.endsWith('.rs')) {
|
||||
files.push(entryPath);
|
||||
}
|
||||
}
|
||||
|
||||
return files;
|
||||
}
|
||||
|
||||
function chunkCommandArgs(argsToChunk) {
|
||||
// Windows CreateProcess 受命令行长度限制;分批能避免 bindings 文件变多后再次失败。
|
||||
const maxCommandLineChars = process.platform === 'win32' ? 20_000 : 100_000;
|
||||
const chunks = [];
|
||||
let current = [];
|
||||
let currentLength = 0;
|
||||
|
||||
for (const arg of argsToChunk) {
|
||||
const argLength = arg.length + 3;
|
||||
if (current.length > 0 && currentLength + argLength > maxCommandLineChars) {
|
||||
chunks.push(current);
|
||||
current = [];
|
||||
currentLength = 0;
|
||||
}
|
||||
|
||||
current.push(arg);
|
||||
currentLength += argLength;
|
||||
}
|
||||
|
||||
if (current.length > 0) {
|
||||
chunks.push(current);
|
||||
}
|
||||
|
||||
return chunks;
|
||||
}
|
||||
|
||||
function run(command, commandArgs, options = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = spawn(command, commandArgs, {
|
||||
cwd: REPO_ROOT,
|
||||
@@ -171,13 +243,20 @@ function run(command, commandArgs) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (output.includes('Could not format generated files')) {
|
||||
const generatedFormatFailed = output.includes('Could not format generated files');
|
||||
|
||||
if (generatedFormatFailed && options.allowGeneratedFormatFailure) {
|
||||
resolve({generatedFormatFailed});
|
||||
return;
|
||||
}
|
||||
|
||||
if (generatedFormatFailed) {
|
||||
reject(new Error(`${command} 生成后格式化失败。`));
|
||||
return;
|
||||
}
|
||||
|
||||
if (code === 0) {
|
||||
resolve();
|
||||
resolve({generatedFormatFailed: false});
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user