接入proto

This commit is contained in:
chen wei bo
2025-08-13 17:23:54 +08:00
parent 707946304e
commit 48c712edc5
9 changed files with 2835 additions and 2 deletions
+52
View File
@@ -0,0 +1,52 @@
// Tools/build-proto.js
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
const SRC = path.join(__dirname, '..', '..', 'Proto'); // .proto 源文件目录
const OUT_JS = path.join(__dirname, '..', '..', 'assets', 'Scripts', 'proto', 'proto.pb.js');
const OUT_DTS = path.join(__dirname, '..', '..', 'assets', 'Scripts', 'proto', 'proto.pb.d.ts');
// 递归收集所有 .proto 文件路径
function walk(dir) {
const files = [];
for (const name of fs.readdirSync(dir)) {
const p = path.join(dir, name);
const stat = fs.statSync(p);
if (stat.isDirectory()) files.push(...walk(p));
else if (name.endsWith('.proto')) files.push(p);
}
return files;
}
const allProtoFiles = walk(SRC);
if (allProtoFiles.length === 0) {
console.error('没有找到任何 .proto 文件!');
process.exit(1);
}
// 确保输出目录存在
fs.mkdirSync(path.dirname(OUT_JS), { recursive: true });
// 1) 生成一个 JS 文件
execSync([
'pbjs',
'-t static-module',
'-w es6', // 生成 ESM 语法
'--dependency protobufjs/minimal.js',
`-o "${OUT_JS}"`,
`-p "${SRC}"`, // 让 pbjs 识别 proto import
...allProtoFiles.map(f => `"${f}"`) // 所有 proto 文件
].join(' '), { stdio: 'inherit' });
// 2) 生成一个 TS 声明文件
execSync([
'pbts',
'--main',
`-o "${OUT_DTS}"`,
`"${OUT_JS}"`
].join(' '), { stdio: 'inherit' });
console.log(`生成完成!
JS 文件: ${OUT_JS}
TS 文件: ${OUT_DTS}`);
+15
View File
@@ -0,0 +1,15 @@
const fs = require('fs-extra');
const ps = require('path');
(async () => {
// 目标输出目录(proto 生成文件存放处)
const outDir = ps.join(__dirname, '..', '..', 'assets', 'Scripts', 'proto');
try {
await fs.emptyDir(outDir);
console.log(`已清空目录: ${outDir}`);
} catch (err) {
console.error(`清空目录失败: ${outDir}`, err);
process.exit(1);
}
})();
+34
View File
@@ -0,0 +1,34 @@
const fs = require('fs');
const path = require('path');
const DTS_DIR = path.join(__dirname, '..', '..', 'assets', 'Scripts', 'proto');
const NAMESPACE = 'proto';
function walk(dir) {
let results = [];
for (const name of fs.readdirSync(dir)) {
const p = path.join(dir, name);
const stat = fs.statSync(p);
if (stat.isDirectory()) results = results.concat(walk(p));
else if (name.endsWith('.d.ts')) results.push(p);
}
return results;
}
function wrapFile(filePath) {
const original = fs.readFileSync(filePath, 'utf8');
if (original.includes(`declare namespace ${NAMESPACE}`)) {
console.log(`跳过已包装文件: ${filePath}`);
return;
}
const wrapped = `declare namespace ${NAMESPACE} {\n${original}\n}\nexport default ${NAMESPACE};\n`;
fs.writeFileSync(filePath, wrapped, 'utf8');
console.log(`已包装文件: ${filePath}`);
}
const files = walk(DTS_DIR);
files.forEach(wrapFile);
console.log(`处理完成,共包装 ${files.length} 个 .d.ts 文件`);