为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁星coding 2022-10-04 19:51:08
有这个软件包 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我应该在主包裹的进口声明中放入什么?
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

Go源的生成方式存在一些挑战。我假设存储库作者的目标是跨语言的一致性,以及Go的用例。所以,是的,对他们和我们来说都是可怕的。GOPATHGO MODULES


这是一个 (!?) 解决方案:


假设您处于其中,并且它包含同一级别的“my-模块”的克隆,即:/path/to/somediropentelemetry-proto


.

├── my-module

└── opentelemetry-proto

make 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-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

注意使用向下到包的路径是必需的(它们不使用Go模块),因此,如果我们使用,我们可以GOPATHGOPATHGOPATH=${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/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"

)


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信