iT邦幫忙

2021 iThome 鐵人賽

DAY 13
1
Modern Web

Let's Go! 解剖Go server開發到部署的過程系列 第 13

day 13 - go mod & vendor 簡介

完成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喔!


上一篇
day 12 - API組裝實作
下一篇
day 14 - drone 的go-test & golangci-lint
系列文
Let's Go! 解剖Go server開發到部署的過程30

尚未有邦友留言

立即登入留言