【Golang】Go module

環境

  • go version go1.12.9 darwin/amd64
  • 官方教學 : https://github.com/golang/go/wiki/Modules#quick-start

啟用方式

  • 支援 GO 1.11 以後版本
    • 確認版本 go version,檢查環境變數 : go env
  • 調用方式有兩種
    • 在 GOPATH 外,確定 GO111MODULE 沒有設定或者設定為 auto,並在專案中建立 go.mod
    • 在 GOPAHT 中,設定 export GO111MODULE=on,就可直接在 GOPATH 中使用

使用

可參考快速使用 https://github.com/golang/go/wiki/Modules#quick-start

1. 建立 repo

1
2
3
4
$ mkdir -p /tmp/scratchpad/repo
$ cd /tmp/scratchpad/repo
$ git init -q
$ git remote add origin https://github.com/my/repo

2. 初始化 go module

1
$ go mod init github.com/my/repo
  • {github.com/my/repo} : 只是一個對應的名稱

3. 設定 main.go

1
2
3
4
5
6
7
8
9
10
11
12
$ cat <<EOF > hello.go
package main

import (
    "fmt"
    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}
EOF

4. 建立 hello 執行檔

1
2
$ go build -o hello
$ ./hello
  • go build|test|install : 都會下載 pkg 到 $GOPATH/pkg/mod 目錄下
    • 使用 go mod download
  • 因為並沒有明確設定 go.mod 中 rsc.io/quote 的版本,會自動下載最新版本,可以去 go.mod 中檢查變動
  • 可以注意到並沒有用 go get 的指令
  • 當想要變更版本,可以使用 go get foo@v1.2.3, go get foo@master, go get foo@e3702bed2, 或者直接編輯 go.mod 然後執行下載.

一個標準的 go.mod

1
2
3
4
5
6
module maxtest
require (
	github.com/joho/godotenv v1.3.0
	rsc.io/quote v1.5.2
)
go 1.12	
  • 下載的 go pkg 都會放在 GOPATH/pkg/mod/... 路徑中
  • gomod 不會在 $GOPATH/src 目錄下保存 pkg 包的源碼,而是包源碼和鏈接庫保存在 $GOPATH/pkg/mod 目錄下。

一些會用到的相關指令

https://github.com/golang/go/wiki/Modules#daily-workflow

  • go list -m all
    • 查看所有目前 build 後有使用的相依版本(direct and indirect 都會列出)
  • go list -u -m all
    • 對所有的 direct 與 indirect 相依,查看有效的最小版本與補丁升級。(details)
  • go list -u -m -json all
    • 用 json 格式顯示詳細資料
  • go get -u or go get -u=patch
    • 更新所有相依到最新的版本號或者補丁升級(pre-releases 會被忽略)
  • go build ./... or go test ./...
    • 在根目錄執行 build 與 test 會下載 module
  • go mod tidy
    • 從 go.mod 中,新增或移除沒用的 modules
  • go mod vendor
    • 若你有在使用 vendor, 可使用此指令, 將 modules 複製到 vendor 目錄下

其他

  • go list 只是把 cache 更新, 要用 go mod download 才會下載
  • go mod edit -fmt : 重新格式化 go.mod 的格式, ex : 如果版本不是 3 位數,會補齊
  • 清除下載的 pkg & cache : go clean -i -x -modcache

go.mod 與 go.sum

  • 確保 go.sum 與 go.mod 一起遞交到 git 中
  • For validation purposes, go.sum contains the expected cryptographic checksums of the content of specific module versions.
  • go.sum 是為了驗證目的,go.sum 包含所有指定版本的 cryptographic checksums
  • 此外,go.sum 紀錄的 checksums 包含所有 direct 與 indriect 的相依庫,曾經建立過的。因此 go.sum 算是一種歷史紀錄。