Как создать рабочий протокол в go без копирования файлов Google?

#go #grpc #grpc-go

#Вперед #grpc #grpc-go

Вопрос:

Я пытаюсь использовать https://github.com/grpc-ecosystem/grpc-gateway но когда я пытаюсь запустить

protoc -I/usr/local/include -I. -I${GOPATH}/src -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis --go_out=plugins=grpc,paths=source_relative:./ example/example.proto

ОШИБКА src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis: предупреждение: каталог не существует.

Чтобы решить эту проблему, я приношу необходимые файлы вручную, но я чувствую, что это ненужно, есть способ сделать это автоматическим, я запускаю раньше go get -u github.com/grpc-ecosystem/grpc-gateway/

но все еще нет способа

Комментарии:

1. Вы уверены, что ${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis существует? можете ли вы попробовать открыть его? с cd ?

2. В том-то и проблема, что его не существует

Ответ №1:

Протоколы, которые вы пытаетесь загрузить, взяты из этого модуля

 env GO111MODULE=on go get github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2
  

Ответ №2:

Взгляните на это (выдержка из Dockerfile ):

 ARG VERS="3.13.0"
ARG ARCH="linux-x86_64"
RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v${VERS}/protoc-${VERS}-${ARCH}.zip --output-document=./protoc-${VERS}-${ARCH}.zip amp;amp; 
    apt update amp;amp; apt install -y unzip amp;amp; 
    unzip -o protoc-${VERS}-${ARCH}.zip -d protoc-${VERS}-${ARCH} amp;amp; 
    mv protoc-${VERS}-${ARCH}/bin/* /usr/local/bin amp;amp; 
    mv protoc-${VERS}-${ARCH}/include/* /usr/local/include amp;amp; 
    go get -u github.com/golang/protobuf/protoc-gen-go amp;amp; 
    go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway

ARG REPO="..."
ARG MODULE="github.com/${REPO}"

# Generates the Golang protobuf files
# NB Uses `go list` to determine the correct Modules directory for the package (!) containing Google APIs protos
RUN protoc 
    --proto_path=. 
    --proto_path=$(go list -f '{{ .Dir }}' -m github.com/grpc-ecosystem/grpc-gateway)/third_party/googleapis 
    --go_out=plugins=grpc,module=${MODULE}:. 
    ./protos/*.proto
  

Я часто использую этот фрагмент при создании решений на основе gRPC, которые используют gRPC gateway.

Сначала RUN получает protoc , protoc-gen-go и -protoc-gen-grpc-gateway .

Второй RUN использует go list для идентификации установленного grpc-gateway модуля и указывает protoc на него.

Ответ №3:

Мое решение заключается в том, что:

 protoc --go_out=./ --go-grpc_out=./ -I$(go list -f '{{ .Dir }}' -m github.com/example/example) example/example.proto
  

Он генерирует файл .pb.go и _grpc.pb.go в текущем каталоге, где

github.com/example/example

имя модуля go, с которым вы хотите взаимодействовать

пример/example.proto

относительный путь URL репозитория для файла proto / файлов

Также, прежде чем вы должны загрузить модуль локально с помощью go get github.com/example/example