未定义:grpc.SupportPackageIsVersion7 grpc.ServiceRegistrar
undefined: grpc.SupportPackageIsVersion7 grpc.ServiceRegistrar
在docker内部,由于这个错误,我似乎无法编译我的gRPC微服务:
Step 4/9 : RUN make build
---> Running in ceb6e4d0e19b
protoc --version
libprotoc 3.12.4
protoc --proto_path=pkg/proto/notify/ --go_out=pkg/proto/notify/ --go-grpc_out=pkg/proto/notify/ --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative notify.proto
plugin versions reported in *.pb.go files:
./pkg/proto/notify/notify.pb.go:// protoc-gen-go v1.25.0-devel
./pkg/proto/notify/notify.pb.go:// protoc v3.12.4
go build -o notify-service *.go
go: downloading github.com/lib/pq v1.7.0
go: downloading google.golang.org/grpc v1.27.0
go: downloading github.com/jinzhu/gorm v1.9.14
go: downloading github.com/aws/aws-sdk-go v1.33.7
go: downloading github.com/go-kit/kit v0.10.0
go: downloading google.golang.org/protobuf v1.25.0
go: downloading github.com/go-co-op/gocron v0.2.1
go: downloading github.com/sirupsen/logrus v1.6.0
go: downloading github.com/golang/protobuf v1.4.2
go: downloading github.com/matcornic/hermes/v2 v2.1.0
go: downloading github.com/jhillyerd/enmime v0.8.1
go: downloading golang.org/x/sys v0.0.0-20200523222454-059865788121
go: downloading github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43
go: downloading github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe
go: downloading github.com/imdario/mergo v0.3.9
go: downloading github.com/russross/blackfriday/v2 v2.0.1
go: downloading github.com/jinzhu/inflection v1.0.0
go: downloading github.com/Masterminds/sprig v2.16.0+incompatible
go: downloading golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2
go: downloading github.com/PuerkitoBio/goquery v1.5.1
go: downloading github.com/pkg/errors v0.9.1
go: downloading golang.org/x/text v0.3.2
go: downloading github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04
go: downloading github.com/shurcooL/sanitized_anchor_name v1.0.0
go: downloading github.com/aokoli/goutils v1.0.1
go: downloading google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013
go: downloading gopkg.in/gormigrate.v1 v1.6.0
go: downloading github.com/gorilla/css v1.0.0
go: downloading github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf
go: downloading github.com/andybalholm/cascadia v1.1.0
go: downloading github.com/gogs/chardet v0.0.0-20150115103509-2404f7772561
go: downloading golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37
go: downloading github.com/olekukonko/tablewriter v0.0.1
go: downloading github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a
go: downloading github.com/huandu/xstrings v1.2.0
go: downloading github.com/Masterminds/semver v1.4.2
go: downloading github.com/google/uuid v1.1.1
go: downloading github.com/mattn/go-runewidth v0.0.4
go: downloading github.com/go-logfmt/logfmt v0.5.0
go: downloading github.com/jmespath/go-jmespath v0.3.0
# gitlab.com/kuecr/fero/backend/notify/pkg/proto/notify
pkg/proto/notify/notify_grpc.pb.go:14:11: undefined: grpc.SupportPackageIsVersion7
pkg/proto/notify/notify_grpc.pb.go:71:30: undefined: grpc.ServiceRegistrar
make: *** [Makefile:14: build] Error 2
ERROR: Service 'notify' failed to build: The command '/bin/sh -c make build' returned a non-zero code: 2
make: *** [Makefile:64: build/notify] Error 1
然而,在 Docker 之外,事情是 运行 并成功编译。
这是我的基础 Docker 图片:
RG go_version
FROM golang:${go_version}-buster
ARG pb_version
RUN apt-get update && apt-get install -y build-essential curl git wget unzip && rm -rf /var/lib/apt/lists/*
RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v${pb_version}/protobuf-cpp-${pb_version}.zip && \
unzip protobuf-cpp-${pb_version}.zip && \
cd protobuf-${pb_version} && \
./configure && \
make && \
make check && \
make install && \
ldconfig && \
cd ../ && \
rm -rf protobuf-*
RUN go get github.com/githubnemo/CompileDaemon && \
go get github.com/golang/protobuf/protoc-gen-go && \
go get github.com/grpc/grpc-go/cmd/protoc-gen-go-grpc && \
go install github.com/golang/protobuf/protoc-gen-go && \
go install github.com/grpc/grpc-go/cmd/protoc-gen-go-grpc
这是编译完成的Docker图像:
FROM registry.gitlab.com/kuecr/devops/go-protobuf-base:1.14 as base
WORKDIR /app
COPY . .
RUN make build
FROM base as testing
ENTRYPOINT ["make", "test"]
FROM base as production
RUN make build
ENTRYPOINT CompileDaemon -log-prefix=false -build="go build -o notify-service" -command="./notify-service"
我的 docker 和 docker-compose 和 protoc 版本:
✖ docker --version && docker-compose --version
Docker version 19.03.12-ce, build 48a66213fe
docker-compose version 1.26.2, build unknown
➜ protoc --version
libprotoc 3.12.4
这是我在我的机器上 运行 make build
时发生的情况:
➜ make build
protoc --version
libprotoc 3.12.4
protoc --proto_path=pkg/proto/notify/ --go_out=pkg/proto/notify/ --go-grpc_out=pkg/proto/notify/ --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative notify.proto
plugin versions reported in *.pb.go files:
./pkg/proto/notify/notify.pb.go:// protoc-gen-go v1.25.0
./pkg/proto/notify/notify.pb.go:// protoc v3.12.4
go build -o notify-service *.go
我使用的是 Golang 1.15,而 Docker 图像使用的是 1.14。
此错误的要点是用于生成代码的二进制版本与当前代码版本不兼容。一个快速简单的解决方案是尝试将 protoc-gen-go
编译器和 gRPC 库更新到最新版本。
go get -u github.com/golang/protobuf/protoc-gen-go
然后重新生成原型
heres link 到讨论该问题的 reddit 线程
我通过将 grpc-go 版本指定为 v1.33.0-dev
解决了这个问题,但是这个版本不包含在版本 v1.31.1
.
中
作为@Jay Lane 回答的补充,我想分享我放在一起的 Dockerfile 配置:
ARG go_version
FROM golang:${go_version}-buster
ARG pb_version
ARG grpc_version
ARG gen_version
ARG compile_daemon_version
ARG dlv_version
RUN apt-get update && apt-get install -y build-essential curl git wget unzip && rm -rf /var/lib/apt/lists/*
RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v${pb_version}/protobuf-cpp-${pb_version}.zip && \
unzip protobuf-cpp-${pb_version}.zip && \
cd protobuf-${pb_version} && \
./configure && \
make && \
make check && \
make install && \
ldconfig && \
cd ../ && \
rm -rf protobuf-*
WORKDIR /tmp
RUN GO111MODULE=on go get google.golang.org/protobuf/cmd/protoc-gen-go@v${gen_version} && \
GO111MODULE=on go get google.golang.org/grpc@v${grpc_version} && \
GO111MODULE=on go get github.com/githubnemo/CompileDaemon@v${compile_daemon_version} && \
GO111MODULE=on go get github.com/go-delve/delve/cmd/dlv@v${dlv_version}
RUN git clone https://github.com/grpc/grpc-go.git && \
cd grpc-go/cmd/protoc-gen-go-grpc && \
git checkout v${grpc_version} && go install . && \
cd /tmp && rm -rf grpc-go
WORKDIR /go
我也将 google.golang.org/grpc
更新为 v1.31.1
。
编辑:
这是我用来帮助构建此映像的 Makefile,为了完整起见包含在内:
GO_VERSION=1.14
PROTOBUF_VERSION=3.12.4
GEN_VERSION=1.25.0
GRPC_VERSION=1.31.1
COMPILE_DAEMON_VERSION=1.2.1
DLV_VERSION=1.5.0
push: build
docker push registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION)
build:
docker build \
--build-arg pb_version=$(PROTOBUF_VERSION) \
--build-arg go_version=$(GO_VERSION) \
--build-arg gen_version=$(GEN_VERSION) \
--build-arg grpc_version=$(GRPC_VERSION) \
--build-arg compile_daemon_version=$(COMPILE_DAEMON_VERSION) \
--build-arg dlv_version=$(DLV_VERSION) \
-t registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION) .
history:
docker image history registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION)
sh:
docker run --rm --interactive --tty --entrypoint /bin/sh registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION)
他们已经在他们的文档中提供了这个解决方案 here。我遇到了同样的问题,这是我的解决方案:
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u google.golang.org/grpc
protoc --go_out=plugins=grpc:. *.proto
Here 是如果你没有使用 Go modules:
的解释
grpc.SupportPackageIsVersion
用于跟踪protobuf生成代码的版本,与grpc release版本不同
简而言之,您生成的 GRPC 代码结构比您的 google.golang.org/grpc
包更新。因此,您必须将 go grpc
软件包更新为新软件包。
SupportPackageIsVersion7
1.32.0
版本后支持。他们支持旧版本 go version >= 1.12
要更新它你应该
首先,去掉当前的,要找到它存放的地方,可以用echo $PATH
命令找出这个文件在哪里。然后删除它。
其次,安装新的,要安装它你可以运行这个命令。
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
注意如果你有任何问题,请改用这个命令,
go get -u github.com/golang/protobuf/protoc-gen-go
更新后,您必须编辑 go.mod
文件。
更改此行:
google.golang.org/grpc v1.21.1
至
google.golang.org/grpc v1.32.0// or newer
注意:您可以从这个URL
找到最新版本
您可以在 rpc_util.go
末尾的常量中找到包的版本支持。
像这样:
const (
SupportPackageIsVersion3 = true
SupportPackageIsVersion4 = true
SupportPackageIsVersion5 = true
SupportPackageIsVersion6 = true
SupportPackageIsVersion7 = true
)
即使 go get -u
我的版本出于某种原因也没有更新到最后一个版本。我不得不在 go.mod 中手动将 google.golang.org/grpc v1.27.0
更新为 google.golang.org/grpc v1.34.0
(最新版本 attow)。然后就成功了。
在docker内部,由于这个错误,我似乎无法编译我的gRPC微服务:
Step 4/9 : RUN make build
---> Running in ceb6e4d0e19b
protoc --version
libprotoc 3.12.4
protoc --proto_path=pkg/proto/notify/ --go_out=pkg/proto/notify/ --go-grpc_out=pkg/proto/notify/ --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative notify.proto
plugin versions reported in *.pb.go files:
./pkg/proto/notify/notify.pb.go:// protoc-gen-go v1.25.0-devel
./pkg/proto/notify/notify.pb.go:// protoc v3.12.4
go build -o notify-service *.go
go: downloading github.com/lib/pq v1.7.0
go: downloading google.golang.org/grpc v1.27.0
go: downloading github.com/jinzhu/gorm v1.9.14
go: downloading github.com/aws/aws-sdk-go v1.33.7
go: downloading github.com/go-kit/kit v0.10.0
go: downloading google.golang.org/protobuf v1.25.0
go: downloading github.com/go-co-op/gocron v0.2.1
go: downloading github.com/sirupsen/logrus v1.6.0
go: downloading github.com/golang/protobuf v1.4.2
go: downloading github.com/matcornic/hermes/v2 v2.1.0
go: downloading github.com/jhillyerd/enmime v0.8.1
go: downloading golang.org/x/sys v0.0.0-20200523222454-059865788121
go: downloading github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43
go: downloading github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe
go: downloading github.com/imdario/mergo v0.3.9
go: downloading github.com/russross/blackfriday/v2 v2.0.1
go: downloading github.com/jinzhu/inflection v1.0.0
go: downloading github.com/Masterminds/sprig v2.16.0+incompatible
go: downloading golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2
go: downloading github.com/PuerkitoBio/goquery v1.5.1
go: downloading github.com/pkg/errors v0.9.1
go: downloading golang.org/x/text v0.3.2
go: downloading github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04
go: downloading github.com/shurcooL/sanitized_anchor_name v1.0.0
go: downloading github.com/aokoli/goutils v1.0.1
go: downloading google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013
go: downloading gopkg.in/gormigrate.v1 v1.6.0
go: downloading github.com/gorilla/css v1.0.0
go: downloading github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf
go: downloading github.com/andybalholm/cascadia v1.1.0
go: downloading github.com/gogs/chardet v0.0.0-20150115103509-2404f7772561
go: downloading golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37
go: downloading github.com/olekukonko/tablewriter v0.0.1
go: downloading github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a
go: downloading github.com/huandu/xstrings v1.2.0
go: downloading github.com/Masterminds/semver v1.4.2
go: downloading github.com/google/uuid v1.1.1
go: downloading github.com/mattn/go-runewidth v0.0.4
go: downloading github.com/go-logfmt/logfmt v0.5.0
go: downloading github.com/jmespath/go-jmespath v0.3.0
# gitlab.com/kuecr/fero/backend/notify/pkg/proto/notify
pkg/proto/notify/notify_grpc.pb.go:14:11: undefined: grpc.SupportPackageIsVersion7
pkg/proto/notify/notify_grpc.pb.go:71:30: undefined: grpc.ServiceRegistrar
make: *** [Makefile:14: build] Error 2
ERROR: Service 'notify' failed to build: The command '/bin/sh -c make build' returned a non-zero code: 2
make: *** [Makefile:64: build/notify] Error 1
然而,在 Docker 之外,事情是 运行 并成功编译。
这是我的基础 Docker 图片:
RG go_version
FROM golang:${go_version}-buster
ARG pb_version
RUN apt-get update && apt-get install -y build-essential curl git wget unzip && rm -rf /var/lib/apt/lists/*
RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v${pb_version}/protobuf-cpp-${pb_version}.zip && \
unzip protobuf-cpp-${pb_version}.zip && \
cd protobuf-${pb_version} && \
./configure && \
make && \
make check && \
make install && \
ldconfig && \
cd ../ && \
rm -rf protobuf-*
RUN go get github.com/githubnemo/CompileDaemon && \
go get github.com/golang/protobuf/protoc-gen-go && \
go get github.com/grpc/grpc-go/cmd/protoc-gen-go-grpc && \
go install github.com/golang/protobuf/protoc-gen-go && \
go install github.com/grpc/grpc-go/cmd/protoc-gen-go-grpc
这是编译完成的Docker图像:
FROM registry.gitlab.com/kuecr/devops/go-protobuf-base:1.14 as base
WORKDIR /app
COPY . .
RUN make build
FROM base as testing
ENTRYPOINT ["make", "test"]
FROM base as production
RUN make build
ENTRYPOINT CompileDaemon -log-prefix=false -build="go build -o notify-service" -command="./notify-service"
我的 docker 和 docker-compose 和 protoc 版本:
✖ docker --version && docker-compose --version
Docker version 19.03.12-ce, build 48a66213fe
docker-compose version 1.26.2, build unknown
➜ protoc --version
libprotoc 3.12.4
这是我在我的机器上 运行 make build
时发生的情况:
➜ make build
protoc --version
libprotoc 3.12.4
protoc --proto_path=pkg/proto/notify/ --go_out=pkg/proto/notify/ --go-grpc_out=pkg/proto/notify/ --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative notify.proto
plugin versions reported in *.pb.go files:
./pkg/proto/notify/notify.pb.go:// protoc-gen-go v1.25.0
./pkg/proto/notify/notify.pb.go:// protoc v3.12.4
go build -o notify-service *.go
我使用的是 Golang 1.15,而 Docker 图像使用的是 1.14。
此错误的要点是用于生成代码的二进制版本与当前代码版本不兼容。一个快速简单的解决方案是尝试将 protoc-gen-go
编译器和 gRPC 库更新到最新版本。
go get -u github.com/golang/protobuf/protoc-gen-go
然后重新生成原型
heres link 到讨论该问题的 reddit 线程
我通过将 grpc-go 版本指定为 v1.33.0-dev
解决了这个问题,但是这个版本不包含在版本 v1.31.1
.
作为@Jay Lane 回答的补充,我想分享我放在一起的 Dockerfile 配置:
ARG go_version
FROM golang:${go_version}-buster
ARG pb_version
ARG grpc_version
ARG gen_version
ARG compile_daemon_version
ARG dlv_version
RUN apt-get update && apt-get install -y build-essential curl git wget unzip && rm -rf /var/lib/apt/lists/*
RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v${pb_version}/protobuf-cpp-${pb_version}.zip && \
unzip protobuf-cpp-${pb_version}.zip && \
cd protobuf-${pb_version} && \
./configure && \
make && \
make check && \
make install && \
ldconfig && \
cd ../ && \
rm -rf protobuf-*
WORKDIR /tmp
RUN GO111MODULE=on go get google.golang.org/protobuf/cmd/protoc-gen-go@v${gen_version} && \
GO111MODULE=on go get google.golang.org/grpc@v${grpc_version} && \
GO111MODULE=on go get github.com/githubnemo/CompileDaemon@v${compile_daemon_version} && \
GO111MODULE=on go get github.com/go-delve/delve/cmd/dlv@v${dlv_version}
RUN git clone https://github.com/grpc/grpc-go.git && \
cd grpc-go/cmd/protoc-gen-go-grpc && \
git checkout v${grpc_version} && go install . && \
cd /tmp && rm -rf grpc-go
WORKDIR /go
我也将 google.golang.org/grpc
更新为 v1.31.1
。
编辑:
这是我用来帮助构建此映像的 Makefile,为了完整起见包含在内:
GO_VERSION=1.14
PROTOBUF_VERSION=3.12.4
GEN_VERSION=1.25.0
GRPC_VERSION=1.31.1
COMPILE_DAEMON_VERSION=1.2.1
DLV_VERSION=1.5.0
push: build
docker push registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION)
build:
docker build \
--build-arg pb_version=$(PROTOBUF_VERSION) \
--build-arg go_version=$(GO_VERSION) \
--build-arg gen_version=$(GEN_VERSION) \
--build-arg grpc_version=$(GRPC_VERSION) \
--build-arg compile_daemon_version=$(COMPILE_DAEMON_VERSION) \
--build-arg dlv_version=$(DLV_VERSION) \
-t registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION) .
history:
docker image history registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION)
sh:
docker run --rm --interactive --tty --entrypoint /bin/sh registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION)
他们已经在他们的文档中提供了这个解决方案 here。我遇到了同样的问题,这是我的解决方案:
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u google.golang.org/grpc
protoc --go_out=plugins=grpc:. *.proto
Here 是如果你没有使用 Go modules:
的解释grpc.SupportPackageIsVersion
用于跟踪protobuf生成代码的版本,与grpc release版本不同
简而言之,您生成的 GRPC 代码结构比您的 google.golang.org/grpc
包更新。因此,您必须将 go grpc
软件包更新为新软件包。
SupportPackageIsVersion7
1.32.0
版本后支持。他们支持旧版本 go version >= 1.12
要更新它你应该
首先,去掉当前的,要找到它存放的地方,可以用
echo $PATH
命令找出这个文件在哪里。然后删除它。其次,安装新的,要安装它你可以运行这个命令。
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
注意如果你有任何问题,请改用这个命令,
go get -u github.com/golang/protobuf/protoc-gen-go
更新后,您必须编辑 go.mod
文件。
更改此行:
google.golang.org/grpc v1.21.1
至
google.golang.org/grpc v1.32.0// or newer
注意:您可以从这个URL
找到最新版本您可以在 rpc_util.go
末尾的常量中找到包的版本支持。
像这样:
const (
SupportPackageIsVersion3 = true
SupportPackageIsVersion4 = true
SupportPackageIsVersion5 = true
SupportPackageIsVersion6 = true
SupportPackageIsVersion7 = true
)
即使 go get -u
我的版本出于某种原因也没有更新到最后一个版本。我不得不在 go.mod 中手动将 google.golang.org/grpc v1.27.0
更新为 google.golang.org/grpc v1.34.0
(最新版本 attow)。然后就成功了。