2017-05-05 168 views
0

我正在關注的Protocol Buffer for Go tutorial但我有以下問題:協議緩衝區:找不到包

  1. 我創建的地址簿協議定義
syntax = "proto3"; 
package tutorial; 

message Person { 
    string name = 1; 
... 
} 
  • 我成功運行編譯器並生成代碼
  • 我嘗試導入pb包但失敗
  • 這裏是什麼情況:我指定--go_out是同我的原定義:(protoc --go_out=. addressbook.proto

    然後在同一個文件夾中,我創建這些簡單的線條test.go:

    package main 
    
    import "tutorial" 
    

    go build test.go返回錯誤:

    test.go:3:8: cannot find package "tutorial" in any of: 
        /usr/local/go/src/tutorial (from $GOROOT) 
        /home/vagrant/go2/src/tutorial (from $GOPATH) 
    

    然後我改變test.go這樣:

    package main 
    
    import "protobufs/tutorial" 
    

    ,並得到這個錯誤:

    test.go:3:8: cannot find package "protobufs/tutorial" in any of: 
        /usr/local/go/src/protobufs/tutorial (from $GOROOT) 
        /home/vagrant/go2/src/protobufs/tutorial (from $GOPATH) 
    

    ,但如果我改變了進口只:

    package main 
    
    import "protobufs" 
    

    發現,有一個 「教程」 包在該位置:

    test.go:3:8: found packages tutorial (addressbook.pb.go) and main (list_people.go) in /home/vagrant/go2/src/protobufs 
    

    我在做什麼錯?進口應該如何才能完成這項工作?

    謝謝!

    FYI:我去ENV的一個片段:

    GOARCH="amd64" 
    GOBIN="/home/vagrant/go2/bin" 
    GOEXE="" 
    GOHOSTARCH="amd64" 
    GOHOSTOS="linux" 
    GOOS="linux" 
    GOPATH="/home/vagrant/go2" 
    GORACE="" 
    GOROOT="/usr/local/go" 
    
    +1

    爲了讓編譯好的protobuf可以導入爲「tutorial」,需要將'--go_out ='設置爲'$ GOPATH/src/tutorial'。 –

    +0

    是的,這是有效的。謝謝 ! ...似乎我需要閱讀更多關於golang的導入,因爲我不明白爲什麼我不能從同一目錄導入它 – whyme

    回答

    0

    這個問題表明我缺乏圍棋包裝的理解。一些閱讀後,這裏是我的結論/規則:
    每個文件夾 1.一個包:所有在目錄「ABC」的。去的文件將顯示package abc
    2.你不能有包main和包裝abc在相同的文件夾
    3. go install創建包對象abc.a in $GOPATH/pkg/GOOS_GOARCH/<path_to_abc_excluding_abc>
    4。在文件夾中的包main$GOPATH/src/x/y/z/foo/然後go install編譯並安裝名爲foo$GOPATH/bin

    一個可執行文件(路徑的最後一個目錄名)現在,回到最初的問題:目錄$GOPATH/src/protobufs包含多個包:
    - 編譯的protobuf包名tutorial
    - maintest.go
    這與上述規則相矛盾。

    我相信,一個優雅的解決方案是:
    - 假設我在$GOPATH/src/protobufs
    - 創建一個名爲子目錄tutorials
    - 安裝編譯的protobuf在子目錄:protoc --go_out=./tutorial ./addressbook.proto
    - 在test.go現在可以有package mainimport "protobufs/tutorial"

    感謝您投入正確的賽道!