場景: Linux Ubuntu18.04下很久沒有更新Golang1.10.x版本,升級1.13.x后發現改動有些有趣,需要更換一下我的打開方式。
環境:
- Linux Ubuntu 18.04
- Golang 1.13.10 linux/amd64
Golang升級安裝
先記錄一下Golang升級安裝過程以防失憶:
// remove old version rm -rf /usr/local/go // install
wget -c https://dl.google.com/go/go1.13.10.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local
環境變量配置
vim ~/.bashrc
// v1.10.x+ 標配 export GOROOT=/usr/local/go export GOPATH=$HOME/go export PATH=$GOPATH/bin:$GOROOT/bin:$PATH // v1.13.x 新版需再加入 // 必加 export GOPROXY=http://goproxy.cn,direct export GO111MODULE="on" // 可選 export GOBIN=$HOME/go/bin
source ~/.bashrc
GO111MODULE :
- auto : 自 1.11 實驗性加入之后就是默認值。auto 意味着由工具鏈自動判斷是否啟用 go modules。在 1.13 以前的啟用條件是『項目根目錄有 go.mod 且項目不在 GOPATH 內』,1.13+ 去掉了 『不在 GOPATH 內的限制』,也就是只要有 go.mod 就會啟用。
- on : 如果你覺得上面這段話太長懶得看,或者害怕以后啟用條件還會變,那么 1.13 已經准備好全面啟用 go modules,直接設為 on 就好了。設為 on 之后無條件啟用 go modules。
- off : 關閉 go modules,回到 GOPATH 時代。
GOPROXY :
國內環境必備,原因你懂的。甚至可以說這是新版本為中國開發者做出的最大改進之一也不為過。在 dep 的時代是靠自建的代理熬過來的,那么不會代理的朋友就很麻煩了。改用鏡像就友好太多了。
目前國內最早最好的代理是 七牛雲提供的 https://goproxy.cn
。如果團隊內部還有搭建私有代理,可以用 ,
隔開,go 會依次嘗試。最后記得加上 direct
,讓鏡像上找不到的依賴回源查找。(包括但不限於 鏡像還沒同步,私有倉庫 等情況)
GOBIN :
如果沒有設置,默認值為 $GOPATH/bin
,是通過 go get
或 go install
安裝的可執行文件的存放目錄。不設並不影響使用,但考慮到 GOPATH 正在被邊緣化,未來不知道哪個版本就取消了,所以建議還是單獨設置一下比較好。
我為了保持使用習慣,設置了跟($HOME/go)默認相同的目錄,區別只是這個值不依賴 GOPATH 的值。
go env
bear@k40:~$ go env GO111MODULE="on" GOARCH="amd64" GOBIN="/home/bear/go/bin" GOCACHE="/home/bear/.cache/go-build" GOENV="/home/bear/.config/go/env" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/bear/go" GOPRIVATE="" GOPROXY="http://goproxy.cn,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GCCGO="gccgo" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/dev/null" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build545380314=/tmp/go-build -gno-record-gcc-switches"
項目開工的方式
環境都配置好了,然后就可以開始第一個 go 的項目了。由於 go modules 不再依賴 GOPATH,所以項目可以放在任何地方—這個 『任何』,是指可以不是 GOPATH ,但是要是習慣了,繼續放在 $GOPATH/src
也沒問題。
mkdir [projectname]
cd [projectname]
and create go.mod
// Two Methods // 1. 項目本地目錄 go mod init <project_name> // 2. 引入github目錄,這樣的話托管至github后以后go build本地找不到包會從github拉取 go mod init github.com/kumataahh/<project_name>
后續pkg的依賴需要按照以上指定路徑加入:
// Example: import pkg config in user package user import ( "github.com/kumataahh/<project_name>/config" )
隨着開發的進行,還會自動生成 go.sum 文件,記錄依賴的校驗信息。
注意 go.sum 不是 lock 文件 ,重現構建的信息已經包含在 go.mod 里,go.sum 屬於 checksum 文件 ,用來 確保下載的依賴沒有被篡改 。
go.mod 和 go.sum 需要一起提交參與版本控制 。關於 go mod
的詳細用法,可以直接 go help mod
獲取幫助信息以及參考這個鏈接:https://juejin.im/post/5c8e503a6fb9a070d878184a
參考來源:
https://jaycechant.info/2020/setup-golang-env-for-1-13-and-above/