有一个包https://github.com/open-telemetry/opentelemetry-proto,它只包含protobuf定义。要生成golang代码,必须键入:
make gen-gogo build与以下消息一起失败:
build opentel: cannot load github.com/open-telemetry/opentelemetry-proto/gen/go/common/v1: module github.com/open-telemetry/opentelemetry-proto@latest found (v0.11.0), but does not contain package github.com/open-telemetry/opentelemetry-proto/gen/go/common/v我试图在go.mod文件中用另一条路径替换,但显然我不太擅长它。我怎么才能让它起作用?
我已经把生成的文件复制到
$GOPATH/src/opentelemetry-proto/gen/go我应该在我的主包里放什么导入声明?
发布于 2021-10-10 17:36:31
Go源的生成方式存在一些挑战。我假设回购作者的目标是实现跨语言的一致性,以及GOPATH和GO MODULES的使用--用Go.所以,是的,为了他们和我们。
这是一个(!?)解决办法:
假设您在/path/to/somedir中,并且它包含相同级别的opentelemetry-proto和my-module`‘的克隆,即:
.
├── my-module
└── opentelemetry-protomake gen-go和以前一样。这应该会创建./opentelemetry-proto/gengo mod init github.com/open-telemetry/opentelemetry-proto
./opentelemetry-proto/gen/go/github.com/open-telemetry/opentelemetry-proto go.
├── gen
└── go.modmy-module,go mod init my-module,然后:go.mod
module my-module
go 1.17
require (
github.com/open-telemetry/opentelemetry-proto v0.11.0
)
replace (
github.com/open-telemetry/opentelemetry-proto => ../opentelemetry-proto/gen/go/github.com/open-telemetry/opentelemetry-proto注意到需要
GOPATH路径到包(它们不使用Go模块),所以,如果我们使用GOPATH,我们可以使用GOPATH=${GOPATH}:${PROTO_GEN_GO_DIR}/github.com/open-telemetry/opentelemetry-proto
然后,例如。
main.go
package main
import (
v1 "github.com/open-telemetry/opentelemetry-proto/gen/go/collector/metrics/v1"
)
func main() {
// E.g.
_ = v1.ExportMetricsServiceRequest{}
}解释:
make gen-go不创建一个模块,但我们可以创建一个模块。
该模块隐含在gen/go下的路径中,即github.com/open-telemetry/opentelemetry-proto
然后,从我们的项目,我们可以replace提供一个本地路径到它。路径是克隆的路径,然后返回到我们新创建的go.mod。
导入路径是从模块(即过于复杂的替换路径)到我们感兴趣的任何包的路径。
注意,通常使用pb导入,但我使用了
v1。
我要做的是:
我认为生成的代码模块应该与它的回购相匹配。如果opentelemetry-proto是我的,我会在没有gen/go的情况下将源代码生成到回购根
因此-海事组织-将一切简化为:
github.com/open-telemetry/opentelemetry-proto => ../opentelemetry-proto和:
import (
v1 "github.com/open-telemetry/opentelemetry-proto/collector/metrics/v1"
)https://stackoverflow.com/questions/69517065
复制相似问题