Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

go-mod #1

Open
AlexZ33 opened this issue May 4, 2019 · 1 comment
Open

go-mod #1

AlexZ33 opened this issue May 4, 2019 · 1 comment

Comments

@AlexZ33
Copy link
Member

AlexZ33 commented May 4, 2019

go mod 是Golang 1.11 版本引入的官方包(package)依赖管理工具,用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。之前Golang 主要依靠vendor和GOPATH来管理依赖库,vendor相对主流,但现在官方更提倡go mod。
介绍的是go 1.3配合goland 2019.3的使用方法

GO MODULE可以设置为三个字符串值之一:off,on或auto(默认值)。

  • off 则go命令从不使用新模块支持。它查找vendor 目录和GOPATH以查找依赖关系;也就是继续使用“GOPATH模式”。
  • on 则go命令需要使用模块,go 会忽略 $GOPATH 和 vendor 文件夹,只根据go.mod下载依赖。
  • auto 或未设置,则go命令根据当前目录启用或禁用模块支持。仅当当前目录位于$GOPATH/src之外并且其本身包含go.mod文件或位于包含go.mod文件的目录下时,才启用模块支持。
go help modules

go mod命令

download    download modules to local cache (下载依赖的module到本地cache))
edit        edit go.mod from tools or scripts (编辑go.mod文件)
graph       print module requirement graph (打印模块依赖图))
init        initialize new module in current directory (再当前文件夹下初始化一个新的module, 创建go.mod文件))
tidy        add missing and remove unused modules (增加丢失的module,去掉未用的module)
vendor      make vendored copy of dependencies (将依赖复制到vendor下)
verify      verify dependencies have expected content (校验依赖)
why         explain why packages or modules are needed (解释为什么需要依赖)

初始化mod

go mod init [module]可以创建一个go.mod,只有一行信息module。

kratos/go.mod为例:

module github.com/bilibili/kratos

go 1.12

require (
	github.com/BurntSushi/toml v0.3.1
	github.com/aristanetworks/goarista v0.0.0-20190409234242-46f4bc7b73ef // indirect
	github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d // indirect
	github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect
	github.com/cznic/strutil v0.0.0-20181122101858-275e90344537 // indirect
	github.com/dgryski/go-farm v0.0.0-20190323231341-8198c7b169ec
	github.com/fatih/color v1.7.0
	github.com/fsnotify/fsnotify v1.4.7
	github.com/go-playground/locales v0.12.1 // indirect
	github.com/go-playground/universal-translator v0.16.0 // indirect
	github.com/go-sql-driver/mysql v1.4.1
	github.com/gogo/protobuf v1.2.0
	github.com/golang/protobuf v1.2.0
	github.com/leodido/go-urn v1.1.0 // indirect
	github.com/montanaflynn/stats v0.5.0
	github.com/pkg/errors v0.8.1
	github.com/prometheus/client_golang v0.9.2
	github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 // indirect
	github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec // indirect
	github.com/sirupsen/logrus v1.4.1 // indirect
	github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a
	github.com/stretchr/testify v1.3.0
	github.com/tsuna/gohbase v0.0.0-20190201102810-d3184c1526df
	github.com/urfave/cli v1.20.0
	golang.org/x/net v0.0.0-20190311183353-d8887717615a
	golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect
	google.golang.org/grpc v1.20.1
	gopkg.in/AlecAivazis/survey.v1 v1.8.2
	gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
	gopkg.in/go-playground/validator.v9 v9.26.0
)

replace (
	cloud.google.com/go => github.com/googleapis/google-cloud-go v0.26.0
	golang.org/x/crypto => github.com/golang/crypto v0.0.0-20190123085648-057139ce5d2b
	golang.org/x/lint => github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3
	golang.org/x/net => github.com/golang/net v0.0.0-20190311183353-d8887717615a
	golang.org/x/oauth2 => github.com/golang/oauth2 v0.0.0-20180821212333-d2e6202438be
	golang.org/x/sync => github.com/golang/sync v0.0.0-20181108010431-42b317875d0f
	golang.org/x/sys => github.com/golang/sys v0.0.0-20180905080454-ebe1bf3edb33
	golang.org/x/text => github.com/golang/text v0.3.0
	golang.org/x/time => github.com/golang/time v0.0.0-20190308202827-9d24e82272b4
	golang.org/x/tools => github.com/golang/tools v0.0.0-20190328211700-ab21143f2384
	google.golang.org/appengine => github.com/golang/appengine v1.1.0
	google.golang.org/genproto => github.com/google/go-genproto v0.0.0-20180817151627-c66870c02cf8
	google.golang.org/grpc => github.com/grpc/grpc-go v1.20.1
)

  • go命令通过查找当前目录中的go.mod或者当前目录的父目录,或者祖父目录,依次递归查找。

  • go.mod文件可以通过require,replace和exclude语句使用的精确软件包集。

    • require语句指定的依赖项模块
    • replace语句可以替换依赖项模块
    • exclude语句可以忽略依赖项模块
  • go mod download可以下载所需要的依赖,但是依赖并不是下载到GOPATH中,而是GOPATH/pkg/mod中,多个项目可以共享缓存的module。

  • go clean -modcache 清除缓存

在国内访问 golang.org/x 的各个包都需要翻墙,
你可以在go.mod中使用replace替换成github上对应的库。

@AlexZ33
Copy link
Member Author

AlexZ33 commented Apr 2, 2021

go mod 常用操作

将依赖复制到项目路径的vendor文件夹中
go mod vendor
 
忽略cache里的包,只使用vendor目录里的依赖进行编译
go build -mod=vendor
 
校验依赖并查看是否有修改
go mod verify
 
指定module的根目录并生成go.mod文件
go mod init example.com/hello
 
查看module下的所有依赖
go list -m all
 
下载 go.mod 文件中指明的所有依赖
go mod download
 
查看现有的依赖结构
go mod graph
 
拉取依赖,会进行指定性拉取(更新),并不会更新所依赖的其它模块。
go get
 
更新现有的依赖,会强制更新它所依赖的其它全部模块,不包括自身。
go get -u  
 
更新所有直接依赖和间接依赖的模块版本,包括单元测试中用到的。
go get -u -t ./...
 
拉取最新的版本,若存在tag,则优先使用。
go get golang.org/x/text@latest
 
拉取 master 分支的最新 commit。
go get golang.org/x/text@master
 
拉取 tag 为 v0.3.2 的 commit
go get golang.org/x/[email protected]
 
拉取 hash 为 342b231 的 commit,最终会被转换为 v0.3.2
go get golang.org/x/text@342b2e
 
全局设置GOSUMDB
go env -w GOSUMDB="sum.golang.org"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant