Как исключить импорт на стороне клиента
Я использую protoc-gen-validate, плагин генератора кода для проверки протоколов на стороне сервера. Сервер написан на Go, но клиентская часть, однако, находится на Javascript. У меня проблема в том, чтоprotoc-gen-validate
библиотека, похоже, включена в встроенный вывод при использовании ts-protoc-gen, который не поддерживается дляprotoc-gen-validate
. В результатеMODULE_NOT_FOUND
ошибка возникает при использовании сгенерированного кода javascript, ошибка здесь:
internal/modules/cjs/loader.js:1033
throw err;
^
Error: Cannot find module '../../validate/validate_pb.js'
Require stack:
- /home/amadeus/HarmonyProject/harmony-grpc-test/gen/core/v1/core_pb.js
- /home/amadeus/HarmonyProject/harmony-grpc-test/index.js
Я хотел бы знать, как автоматически исключить этот импорт из сгенерированного кода? Кроме того, было бы неплохо, если бы в решении оставались неизменяемыми прото-файлы, как в подмодуле git.
2 ответа
Грязный хак, чтобы исправить это, ищите более элегантные способы сделать это:
IN_DIR="./protocol"
PROTOCOL_BUILD_TMP="./protocol-build-tmp"
mkdir -p $PROTOCOL_BUILD_TMP
cp -r $IN_DIR $PROTOCOL_BUILD_TMP
for dir in $(find "${PROTOCOL_BUILD_TMP}" -name '*.proto' -print0 | xargs -0 -n1 dirname | sort | uniq); do
sed -i -E "s/ \[ \(validate.rules(.*)\];/;/g" $(find "${dir}" -name '*.proto')
sed -i -E "/validate.proto/d" $(find "${dir}" -name '*.proto')
done
rm -r $PROTOCOL_BUILD_TMP
Это тоже грязный хак, но он работает.
Создать
validate_pb.js
файл вместе с сгенерированными файлами и вставьте в него следующий код.
var jspb = require('google-protobuf');
var goog = jspb;
var global = (function() {
if (this) { return this; }
if (typeof window !== 'undefined') { return window; }
if (typeof global !== 'undefined') { return global; }
if (typeof self !== 'undefined') { return self; }
return Function('return this')();
}.call(null));
goog.exportSymbol('proto.tagger', null, global);
Это решило проблему для меня.