Как исключить импорт на стороне клиента

Я использую 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);

Это решило проблему для меня.

Другие вопросы по тегам