1 回答
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"
)
- 1 回答
- 0 关注
- 71 浏览
添加回答
举报