我不是golang開發人員,但目前我必須修復代碼,所以如果我不小心不理解Go的一些基本概念,請提前;)我有一個第三方合同,我必須使用,我沒有影響力。我無法提供合約的實際示例,所以我在Github上制作了類似的示例項目,該項目也存在同樣的問題。簡而言之:文檔有一個深度嵌套的結構,其中一些文檔導入其他文檔:protobufprotosyntax = "proto3";package company.nested1.nested2;import "company/common.proto";option go_package = "nested2";message CompanyMessage { CompanyEnum compEnum = 1;}引用syntax = "proto3";package company;option go_package = "company";enum CompanyEnum { VAR1 = 0; VAR2 = 1;}有一個包含以下代碼的文件:go.modmodule go-programgo 1.16require ( github.com/golang/protobuf v1.5.2 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/grpc v1.40.0 // indirect google.golang.org/protobuf v1.26.0)在編譯到 Golang 代碼時,此導入中存在一個問題。生成的文件具有相對于包的導入,而它們在具有 root 的 go 項目中使用時,無法解析這些導入:*.pb.gocompanygo-project據我所知,以前這個問題已經通過手動編輯生成的文件中的導入來解決。就像下面的屏幕一樣。但在我看來,應該有更好的方法來解決這個問題;)我正在使用此命令從原型文件生成 go 代碼:protoc --proto_path=proto (find proto -name '*.proto') --go_out=plugins=grpc:.所以問題是:解決這種進口問題的正確方法是什么。似乎生成的文件中的導入應該從我的程序根命名空間開始。但是如何實現這一點 - 也許有些選項在命令中我沒有找到。我還嘗試將生成的文件放在內部或內部,并嘗試制作和發布單獨的模塊 - 沒有結果。有沒有一些合適的解決方案?protoc$GOPATH/srcvendors
1 回答

繁花如伊
TA貢獻2012條經驗 獲得超12個贊
這更像是一些指針,而不是一個明確的答案。如果我明天有時間,我會重現這一點,給你一個明確的答案。
這是具有挑戰性的。Protobufs必須為每種語言的包管理找到解決方案,而Go的(雖然IMO改進了)隨著最近添加的模塊而有些復雜。
我對代碼的處理方法是為原型和生成的代碼提供一個單獨的存儲庫。如果原型發生更改,則會重新生成代碼。我可以引用生成的模塊(?。?,也可以重新生成自己。此模型將 protos 保留為最終的“源”,并節省“緩存”生成源的時間。但是在這個配置中,我是我自己的第三方庫維護者。
所以:
模塊在本地表現為目錄樹,其根包含和表示包的子目錄。
go.mod
go.sum
當您為第三方原型生成代碼時,我認為最好在自己的模塊下創建它,作為獨立目錄或作為供應商子目錄。
此模塊的命名應引用第三方,并且可以使用
go mod init
protoc
模塊通常是從代理或存儲庫中提取的,但您可以通過手動添加從模塊路徑到本地路徑的重定向的
替換
來規避這一點(因為第三方不為您托管生成的代碼)。go mod
從您的錯誤中,這應該解決缺少模塊的問題,并使用子目錄,例如 包含生成的代碼,也應該解析包。
company
- 1 回答
- 0 關注
- 90 瀏覽
添加回答
舉報
0/150
提交
取消