protobuf 可以很方便地在各个语言里制定数据交换协议,通过绑定不同的语言进行编译,可生成相应的代码文件。针对 C++ 和 Java 语言的编译,非常简单,好像默认就能搞定(不知道是不是因为我本地 C++ 和 Java 的环境很完善有关),而针对 Go 语言进行编译,则有点麻烦,折腾了好一会,写个笔记备忘一下。

基本的配置步骤

  1. 安装 Go 语言,这个简单,直接安装就可以了。安装好后,记得把 bin 目录添加到系统的 PATH 变量里,这样就可以执行 go 命令了。
  2. 安装 hg 源代码管理工具,Go 下载扩展包的时候要用到的命令。
  3. 安装 goprotobuf 扩展包,先在环境变量里新建一个变量 GOPATH,指向一个你准备用来放置 Go 扩展包的路径,注意,GOPATH 所指向的路径需要与 GOROOT 不一样。
  4. 在 GOPATH 目录下,新建 src 和 pkg 目录。
  5. 安装 goprotobuf,使用如下命令即可安装
    go get code.google.com/p/goprotobuf/{proto,protoc-gen-go}
    
        <p>
          如果前面配置正确的话,这一步应该不会提示什么错误。
        </p>
      </li>
      
      <li>
        上述命令安装成功后,即可在目录 $GOPATH/bin 里找到编译好的 protoc-gen-go.exe 程序,并且把 $GOPATH/bin 添加到系统的 PATH 里,这样从命令行执行的话,可以找到该命令。
      </li>
      <li>
        在 protobuf 的编译脚本里,加上下面这一行,就可以在编译的时候,编译出针对 go 语言的代码文件。 <pre class="src src-shell-script"><span style="color: #99968b">#</span><span style="color: #99968b">!bin/</span><span style="color: #8ac6f2;font-weight: bold">sh</span>
    

    outDir=./out

    #create folder or do something else

    goSucceed=true protoc –go_out=$outDir/go live.proto if [ $? = 0 ]; then echo “build go protocol succeed” else goSucceed=false echo “build go protocol failed” fi

碰到的一些基础问题

如果出现如下错误:

<pre class="example">C:\Users\Administrator&gt;go get -u code.google.com/p/goprotobuf/{proto,protoc-gen-

go} package code.google.com/p/goprotobuf/{proto,protoc-gen-go}: invalid code.google. com/ import path “code.google.com/p/goprotobuf/{proto,protoc-gen-go}”

<p>
  我感觉多半是没设 GOPATH 环境变量,这个我没准确验证。
</p>

<p>
  如果提示如下错误
</p>

<pre class="example">Administrator@DBXXT-20131216M /cygdrive/d/OpenSource/go-packages/src/goprotobuf

$ go get code.google.com/p/goprotobuf/{proto,protoc-gen-go} go: missing Mercurial command. See http://golang.org/s/gogetcmd package code.google.com/p/goprotobuf/proto: exec: “hg”: executable file not found in %PATH% package code.google.com/p/goprotobuf/protoc-gen-go imports code.google.com/p/goprotobuf/protoc-gen-go imports code.google.com/p/goprotobuf/protoc-gen-go: cannot find package “code.google.com/p/goprotobuf/protoc-gen-go” in any of: D:\Go\src\pkg\code.google.com\p\goprotobuf\protoc-gen-go (from $GOROOT) D:\OpenSource\go-packages\src\code.google.com\p\goprotobuf\protoc-gen-go (from $GOPATH)

<p>
  的话,就是没有安装 hg 源代码管理工具。
</p>