完成API實作之後就要開始build
bin檔了。
Go開發的過程中,會使用到很多套件, 在Go v1.11.0之後, 官方推出 go mod 來管理這些相依套件,
操作方式如下
在專案底下初始化go mod 流程go mod init
init執行後之後會提示
-> % go mod init
go: creating new go.mod: module coconut
go: to add module requirements and sums:
go mod tidy
init 執行後會產生go.mod
檔案, 檢視檔案內容會長這樣
module coconut // 專案模組名稱
go 1.16 // 使用來編譯的go version
執行 go mod tidy
-> % go mod tidy
go: finding module for package github.com/joho/godotenv
go: finding module for package google.golang.org/protobuf/reflect/protoreflect
go: finding module for package github.com/urfave/cli
go: finding module for package google.golang.org/protobuf/runtime/protoimpl
go: finding module for package github.com/syhlion/requestwork.v2
go: found github.com/joho/godotenv in github.com/joho/godotenv v1.3.0
go: found github.com/syhlion/requestwork.v2 in github.com/syhlion/requestwork.v2 v0.0.0-20210119021838-2bc6ad110469
go: found github.com/urfave/cli in github.com/urfave/cli v1.22.5
go: found google.golang.org/protobuf/reflect/protoreflect in google.golang.org/protobuf v1.27.1
go: found google.golang.org/protobuf/runtime/protoimpl in google.golang.org/protobuf v1.27.1
go: downloading golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
執行後go.mod
會更新
module pika.rdtech.vip/EvelynChen/coconut
go 1.16
require (
github.com/joho/godotenv v1.3.0
github.com/syhlion/requestwork.v2 v0.0.0-20210119021838-2bc6ad110469
github.com/urfave/cli v1.22.5
google.golang.org/protobuf v1.27.1
)
這時候還還需要把套件載入專案掛進 vendor
go mod vendor
執行後專案底下會產生資料夾vendor/
, 裡面會包含專案使用到的所有套件, 同時會產生go.sum
,go.sum
可以看到目前引用的各套件版本
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
......
這時候專案內的vendor就會包含引用的套件, 如果沒有指定版本的話, 每次更新都會自動更新成最新版,
如果有需要也可以把套件定版在指定的版本
ex: go get -u -insecure github.com/urfave/cli@v1.22.5
, @後面可以加版號或是分支名稱
go build 的時候要執行go build -a -mod vendor
指定用vendor的下的套件來產生執行檔。
使用vendor下的套件來build的好處是可以避免引用的套件更新後接口不相容的狀況, 另一方面是共同開發時不管是在哪個環境都可以確保套件版本是一樣的, 所以我通常都會下go build -a -mod vendor
喔!