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 關注
- 107 瀏覽
添加回答
舉報