標籤:
從第一天開始學習Golang就知道它有一個很讓人心動的特性就是跨平台編譯,但一直沒有去使用。最近做了一個小東西需要用到這個特性,所以在網上進行了搜尋。
首先找到是國內文章是利用下載Go的源碼包,將對其進行編譯安裝,完成後Go/src下的make.bash產生跨平台的編譯器,這樣在每次用時需要指定GOOS及GOARCH來進行編譯,如:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build //編譯為linux 64位系統下的程式
如果需要編譯windows 64 位元下的程式則要再寫一個命令:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build //編譯為windows 64位系統下的程式
具體介紹請看: “Golang的跨平台編譯器”
這種方法針對一次性編譯、測試、學習很有用,但對於需要對多平台編譯一次性處理會有一些麻煩
- 首先你需要針對每個你想要部署的平台在編譯機上都要運行一次相應的 make.bash來產生所需要編譯器
- 每次都要執行相應的編譯命令(這個有點牽強,因為通過shell也可以實現批處理)
- 本機需要保留所有產生的編譯器,如果其他人也需要這樣的環境則需要再執行一次所需編譯器的產生工作
- 為了保持本機乾淨(呵呵)
好吧,除了第一個有點像是一個麻煩,其它的都不是問題,主要目的是引出第二種方法,那就是利用docker進行部署編譯:
- 首先你需要安裝docker
- 下載go的跨平台編譯版本,我用的是golang 1.4.2-cross
sudo docker pull golang:1.4.2cross
GOARCH="amd64"GOBIN=""GOCHAR="6"GOEXE=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="linux"GOPATH="/go"GORACE=""GOROOT="/usr/src/go"GOTOOLDIR="/usr/src/go/pkg/tool/linux_amd64"CC="gcc"GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"CXX="g++"CGO_ENABLED="1"
- 進入root目錄下的bin目錄我們能看到所有可編譯的平台,是不是很多:)
[email protected]:/usr/src/go/bin# lsdarwin_386 dragonfly_386
freebsd_386 freebsd_arm gofmt
linux_arm nacl_amd64p32 netbsd_386 netbsd_arm
openbsd_amd64 plan9_amd64 windows_386darwin_amd64 dragonfly_amd64 freebsd_amd64 go
linux_386 nacl_386
nacl_arm netbsd_amd64 openbsd_386
plan9_386 solaris_amd64 windows_amd64
- 運行:docker run --rm -it -v "$PWD":/go/src/myapp -w /go/src/myapp golang:1.4.2-cross bash
其中:"$PWD",是指將目前的目錄掛載為docker的資料卷
第一個/go/src/myapp 表示為目前的目錄掛載至資料卷的名稱
第二個/go/src/myapp 表示為進行shell後直接進入的工作目錄
docker run --rm -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.3-cross bash $ for GOOS in windows linux; do > for GOARCH in386 amd64; do > go build -v -o myapp-$GOOS-$GOARCH //注意這裡的減號間沒有空格 > done > done
這裡的 GOOS後windows linux指的是編譯為什麼平台,用到那個則輸入那個,運行後輸入出相應的結果:
main.go myapp-linux-386 myapp-linux-amd64 myapp-windows-386 myapp-windows-amd64
Go跨平台編譯的方法學習