猿问

高浪。替换不是实际 go 包的包的模块路径

有这个软件包 https://github.com/open-telemetry/opentelemetry-proto 它只包含原型定义。要生成戈兰代码,必须键入:

make gen-go

并转到生成失败,并显示以下消息:

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

我应该在主包裹的进口声明中放入什么?


繁星coding
浏览 72回答 1
1回答

慕雪6442864

Go源的生成方式存在一些挑战。我假设存储库作者的目标是跨语言的一致性,以及Go的用例。所以,是的,对他们和我们来说都是可怕的。GOPATHGO MODULES这是一个 (!?) 解决方案:假设您处于其中,并且它包含同一级别的“my-模块”的克隆,即:/path/to/somediropentelemetry-proto.├── my-module└── opentelemetry-protomake gen-go如故。这应该创建./opentelemetry-proto/gen开始 :./opentelemetry-proto/gen/go/github.com/open-telemetry/opentelemetry-protogo mod init github.com/open-telemetry/opentelemetry-proto.├── gen└── go.mod从 内部,然后:my-modulego mod init my-modulego.mod:module my-modulego 1.17require (    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注意使用向下到包的路径是必需的(它们不使用Go模块),因此,如果我们使用,我们可以GOPATHGOPATHGOPATH=${GOPATH}:${PROTO_GEN_GO_DIR}/github.com/open-telemetry/opentelemetry-proto然后,例如main.go:package mainimport (    v1 "github.com/open-telemetry/opentelemetry-proto/gen/go/collector/metrics/v1")func main() {    // E.g.    _ = v1.ExportMetricsServiceRequest{}}解释:make gen-go不会创建模块,但我们可以创建一个模块。模块从路径中隐式,即gen/gogithub.com/open-telemetry/opentelemetry-proto然后,从我们的项目中,我们可以提供一条本地路径。该路径是克隆的路径,然后返回到我们新创建的 。replacego.mod导入路径是从模块(即过度复杂的替换路径)到我们感兴趣的任何包的路径。注意通常原始进口是pb,但我使用过。v1我会怎么做:我认为生成的代码的模块应该与其存储库匹配。如果我的,我会将源代码生成到存储库根中,而无需opentelemetry-protogen/go正如这将 - IMO - 简化一切以:github.com/open-telemetry/opentelemetry-proto => ../opentelemetry-proto和:import (    v1 "github.com/open-telemetry/opentelemetry-proto/collector/metrics/v1")
随时随地看视频慕课网APP

相关分类

Go
我要回答