如何批量生成所有Proto文件?脚本配置问题求助
批量生成所有Proto文件的解决方案
1. 调整package.json的脚本命令
先修改scripts里的proto-gen命令,将参数改为指向包含所有proto文件的目录,或者用匹配模式覆盖所有.proto文件(Unix-like环境适用,Windows环境建议用目录遍历方案):
"scripts": { "dev": "next dev -p 3003", "proto-gen": "node ./proto-gen.js --proto-dir=./proto --proto-dir=./generated" }
如果你的脚本支持glob匹配,也可以直接传全局匹配模式:
"scripts": { "dev": "next dev -p 3003", "proto-gen": "node ./proto-gen.js --proto-files='./**/*.proto'" }
2. 修改proto-gen.js脚本以支持批量处理
原来的脚本仅处理单个文件,需要调整为遍历目录或处理多个文件:
方案一:遍历指定目录下的所有.proto文件
如果用--proto-dir参数,脚本里可以递归遍历目录收集所有proto文件:
const fs = require('fs'); const path = require('path'); const args = require('minimist')(process.argv.slice(2)); // 递归收集目录下的所有.proto文件 function collectProtoFiles(dir, files = []) { const items = fs.readdirSync(dir); for (const item of items) { const fullPath = path.join(dir, item); const stat = fs.statSync(fullPath); if (stat.isDirectory()) { collectProtoFiles(fullPath, files); } else if (item.endsWith('.proto')) { files.push(fullPath); } } return files; } // 解析传入的目录参数 const protoDirs = args['proto-dir'] || []; const dirList = Array.isArray(protoDirs) ? protoDirs : [protoDirs]; // 收集所有目标proto文件 const allProtoFiles = []; for (const dir of dirList) { allProtoFiles.push(...collectProtoFiles(dir)); } // 批量处理每个proto文件 for (const file of allProtoFiles) { console.log(`正在处理文件:${file}`); // 替换为你原本处理单个proto文件的逻辑,比如protobuf代码生成操作 // 示例:const root = protobuf.loadSync(file); root.generate(...); }
方案二:用glob匹配处理所有proto文件
如果用--proto-files参数,需要先安装glob依赖(npm install glob --save-dev),然后在脚本中解析匹配模式:
const glob = require('glob'); const args = require('minimist')(process.argv.slice(2)); // 获取匹配模式,默认匹配所有目录下的.proto文件 const protoPattern = args['proto-files'] || './**/*.proto'; // 匹配并处理所有文件 glob(protoPattern, (err, files) => { if (err) { console.error('匹配proto文件出错:', err); process.exit(1); } for (const file of files) { console.log(`正在处理文件:${file}`); // 替换为你的生成逻辑 } });
3. 注意事项
- Windows环境下原生shell不支持
**这类glob模式,优先选择方案一的目录遍历方式,避免环境兼容问题。 - 如果proto文件之间存在互相引用,确保生成逻辑能正确处理依赖关系,比如设置正确的proto路径。
内容的提问来源于stack exchange,提问作者sara
相关产品推荐
相关产品推荐

