go - 戈朗。替换不是真正的 go 包的包的模块路径
问题描述
有这个包https://github.com/open-telemetry/opentelemetry-proto 仅包含 protobuf 定义。要生成 golang 代码,必须键入:
make gen-go
go 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
我应该在我的主包中放入什么导入语句?
解决方案
Go 源代码的生成方式存在一些挑战。我假设 repo 作者的目标是跨语言以及Go 的用例GOPATH
和用例的一致性......所以,是的,对他们和我们来说都是粗糙的。GO MODULES
这是一个(!?)解决方案:
假设您在/path/to/somedir
其中并且它包含opentelemetry-proto
同一级别的和“my-module”的克隆,即:
.
├── my-module
└── opentelemetry-proto
make gen-go
像之前一样。这应该创建./opentelemetry-proto/gen
在
./opentelemetry-proto/gen/go/github.com/open-telemetry/opentelemetry-proto
去go mod init github.com/open-telemetry/opentelemetry-proto
:
.
├── gen
└── go.mod
- 从内部
my-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
模块隐含在ie下的路径中github.com/open-telemetry/opentelemetry-proto
然后,从我们的项目中,我们可以replace
为其提供本地路径。路径是克隆的路径,然后返回到我们新创建的go.mod
.
导入路径是从模块(即过度复杂的替换路径)到我们感兴趣的任何包的路径。
注意通常 protobuf 导入是 pb 但我使用过
v1
.
我会做什么:
我认为生成代码的模块应该与其回购相匹配。如果opentelemetry-proto
是我的,我会在没有gen/go
因为这将 - IMO - 将所有内容简化为:
github.com/open-telemetry/opentelemetry-proto => ../opentelemetry-proto
和:
import (
v1 "github.com/open-telemetry/opentelemetry-proto/collector/metrics/v1"
)
推荐阅读
- sql - 以下情况的选择语句
- python - 如何从包含列表的列表中创建 csv 作为标题?
- python-3.x - networkx 从路径到顶点的最短路径
- c# - c#异步任务运行,带参数的函数返回值
- node.js - 节点:转义 JSON 字符串以在 shell exec 中使用
- haskell - 对 Haskell Monad 变形金刚感到困惑
- xamarin.forms - Xamarin - 推送通知,OnMessageReceived 触发多次,加载多个页面
- html - 如何在 HTML 中写出数字的平方根?
- emacs - How do programs like Emacs and Nano get user input while running in terminal without the user having to press enter?
- ballerina - 如何基于 OpenID 发现 URL 创建新的 JWT 验证器?