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/[email protected], @後面可以加版号或是分支名称
go build 的时候要执行go build -a -mod vendor 指定用vendor的下的套件来产生执行档。

使用vendor下的套件来build的好处是可以避免引用的套件更新後接口不相容的状况, 另一方面是共同开发时不管是在哪个环境都可以确保套件版本是一样的, 所以我通常都会下go build -a -mod vendor喔!


<<:  Flutter体验 Day 13-弹性布局

>>:  Day 08:八爪章鱼之 tmux 快捷键

Day14 - 机智接案生活

看过很多文章提到程序设计师接案的陷阱,因自己非本科出身,所以觉得这些陷阱都不会发生在自己身上,再加上...

[C#+ECharts] 使用 ECharts 建立股票 K 线图 (附范例)

今天展示一下如何在 Asp.Net MVC 上显示 ECharts 的 K 线图套件,这个 K 线图...

关於商业视角的时间故事

今天谈一个在商业视角的时间故事。 我的公司盛行加班(勿战),因此有些主管为了体恤加班的同仁,也方便把...

[Day23]交易控制

什麽是资料库中的交易控制呢,即是当A帐户转帐给B帐户时,B帐户却因为系统问题无法顺利入帐,但A帐户已...

【第三十天 - 结尾】

不知不觉来到铁人赛的尾声了,此次系列文的初衷除了自我复习与归纳之前参加比赛的经验,也希望尽量统整一...