Go 釋出二進位制包的方法

白龍發表於2016-04-04

眾所周知,Go的編譯系統是針對原始碼的,如果想釋出一個二進位制檔案給別人,該怎麼做?如何在CI上編譯不同平臺的C程式碼?

下面跟我一起來實驗下:

  1. 建立好專案 在src目錄下建立兩個包路徑,liba 和 main,liba用來實驗隱藏程式碼

    1. 專案各檔案如下
      • liba/dummy.go, 呼叫程式碼先註釋掉,避免衝突

package liba

import (
    "fmt"
)

func libdummy() {
    fmt.Println("this is in dummy lib")
}

// func LibTest() {
//     fmt.Println("dummy library")
//     libdummy()
// }
  • liba/real.go

package liba

import (
    "fmt"
)

func libreal() {
    fmt.Println("this is in real lib")
}

func LibTest() {
    fmt.Println("real library")
    libreal()
}
  • main/main.go

package main

import (
    "liba"
)

func main() {
    liba.LibTest()
}

3. 好了,我們先編譯真實的library, 得到.a 檔案,並跑下看看

go install ./...
 ~/exercises/golib: bin/main
real library
this is in real lib
  1. 將真實的library 拷貝出來備用 cp pkg/darwin_amd64/liba.a .

  2. 將real.go 的程式碼註釋掉,dummy.go 的程式碼取消註釋,並編譯跑下看看


~/exercises/golib: bin/main dummy library this is in dummy lib

  1. 見證奇蹟的時刻到了,我們把real.go 的實現給copy回來,編譯跑下看看

 ~/exercises/golib: cp liba.a pkg/darwin_amd64
 ~/exercises/golib: go install ./...
 ~/exercises/golib: bin/main
real library
this is in real lib

通過這個實驗,可以看出go最後的連結步驟是比較程式碼和.a檔案的建立時間,如果.a 建立的晚,就不會再次對程式碼進行編譯,只做連結。大家可以將上面的cp 換成mv驗證下 :) 總結下,如果想釋出二進位制的go library,就要將.a 檔案和 stub 程式碼一起交付給使用者,並且在編譯的時候做一次替換。

如果有些軟體需要跨平臺編譯,而且還有些底層訪問的C程式碼,可以先編譯成.a 檔案,然後放到CI 平臺上,讓Go交叉編譯的時候連結就好了。

相關文章