92 lines
2.3 KiB
JavaScript
92 lines
2.3 KiB
JavaScript
|
/**
|
||
|
* 将proto文件编译到 src/proto/
|
||
|
*/
|
||
|
const { readdirSync } = require('fs');
|
||
|
const { resolve } = require('path');
|
||
|
const os = require('os');
|
||
|
|
||
|
const { exec } = require('child_process');
|
||
|
|
||
|
const messageDir = resolve(__dirname, '../xian-ncc-da-message');
|
||
|
const protoDir = resolve(messageDir, 'protos');
|
||
|
const destDir = resolve(__dirname, '../src/proto');
|
||
|
|
||
|
/**
|
||
|
* 递归处理所有proto文件生成
|
||
|
* @param {*} file 文件
|
||
|
* @param {*} path 目录
|
||
|
*/
|
||
|
function recursiveGenerate(file, path = [], cmds = []) {
|
||
|
if (file.isFile()) {
|
||
|
// 文件,生成
|
||
|
if (file.name.endsWith('.proto')) {
|
||
|
cmds.push(buildGenerateCmd(file.name, path));
|
||
|
} else {
|
||
|
console.warn('不是proto文件', file.name);
|
||
|
}
|
||
|
} else if (file.isDirectory()) {
|
||
|
// 文件夹,递归
|
||
|
readdirSync(resolve(protoDir, ...path, file.name), {
|
||
|
withFileTypes: true,
|
||
|
}).forEach((f) => {
|
||
|
const subPath = [...path, file.name];
|
||
|
recursiveGenerate(f, subPath, cmds);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const isLinux = os.type().toLowerCase().includes('linux');
|
||
|
|
||
|
function buildGenerateCmd(name, path = []) {
|
||
|
const protoPath = resolve(protoDir, ...path);
|
||
|
const tsPath = resolve(destDir, ...path);
|
||
|
|
||
|
let cmd = ['protoc', `-I=${protoPath}`, `--ts_out=${tsPath}`, `${name}`];
|
||
|
let cmdStr = cmd.join(' ');
|
||
|
return cmdStr;
|
||
|
}
|
||
|
|
||
|
function main() {
|
||
|
const protocDir = resolve(messageDir, 'protoc-22.2');
|
||
|
const protocBin = resolve(
|
||
|
protocDir,
|
||
|
`bin/${isLinux ? 'linux-x86_64' : 'win64'}`
|
||
|
);
|
||
|
const prepareCmds = [];
|
||
|
const setPathCmd = isLinux
|
||
|
? ['export', `PATH=${protocBin}:${protocDir}:"$PATH"`].join(' ')
|
||
|
: ['set', `PATH=${protocBin};${protocDir};%PATH%`].join(' ');
|
||
|
const protocVersionCmd = ['protoc', '--version'].join(' ');
|
||
|
prepareCmds.push(setPathCmd);
|
||
|
prepareCmds.push(protocVersionCmd);
|
||
|
|
||
|
readdirSync(protoDir, {
|
||
|
withFileTypes: true,
|
||
|
}).forEach((f) => {
|
||
|
recursiveGenerate(f, [], prepareCmds);
|
||
|
});
|
||
|
|
||
|
console.log(prepareCmds);
|
||
|
|
||
|
exec(
|
||
|
prepareCmds.join(' && '),
|
||
|
{
|
||
|
maxBuffer: 1024 * 2000,
|
||
|
},
|
||
|
(err, stdout, stderr) => {
|
||
|
if (err) {
|
||
|
console.error(err);
|
||
|
throw err;
|
||
|
} else if (stderr.length > 0) {
|
||
|
console.error(stderr.toString());
|
||
|
throw new Error(stderr.toString());
|
||
|
} else {
|
||
|
console.log(stdout);
|
||
|
}
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// 执行
|
||
|
main();
|