go mod基本命令

  1. 清理缓存
  2. 增加缺失的包,移除没用的包
  3. go mod使用master分支
  4. 依赖关系
  5. 依赖不同版本
  6. 例子
  7. go mod依赖多个版本
  8. replace

清理缓存

go clean --modcache

增加缺失的包,移除没用的包

go mod tidy

go mod使用master分支

在go mod目录执行:
go get git.code.oa.com/nfa/nfalib@master 或 go get git.code.oa.com/nfa/nfalib@commitid
go get会自动更新依赖文件(go.mod, go.sum)

依赖关系

go list -m all显示依赖关系
go list -m -json all显示详细依赖关系
go mod graph 打印模块依赖

依赖不同版本

module github.com/Xuanwo/go-mod-intro

go 1.12

require (
        github.com/google/go-github/v24 v24.0.1
        github.com/google/go-github/v25 v25.0.4
)

可以在同一个文件中引用同一个模块的不同大版本,它们的导入路径不同,所以被看作两个不同的模块

例子

原文地址:https://xuanwo.io/2019/05/27/go-modules/

package main

import (
    v24 "github.com/google/go-github/v24/github"
    v25 "github.com/google/go-github/v25/github"
    "golang.org/x/text/width"

)

var (
    _ = v24.Tag{}
    _ = v25.Tag{}
    _ = width.EastAsianAmbiguous
)

func main() {
    return
}

go.mod中增加一行:golang.org/x/text v0.3.0
使用go list -m all查看当前模块所有的依赖:

go list -m all
github.com/Xuanwo/go-mod-intro
github.com/golang/protobuf v1.2.0
github.com/google/go-github v17.0.0+incompatible
github.com/google/go-github/v24 v24.0.1
github.com/google/go-github/v25 v25.0.4
github.com/google/go-querystring v1.0.0
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
golang.org/x/net v0.0.0-20190311183353-d8887717615a
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a
golang.org/x/text v0.3.0
google.golang.org/appengine v1.1.0

下面我们把golang.org/x/text依赖的v0.3.0修改成v0.2.0,然后重新执行go list -m all查看最终选择的版本:

go list -m all
go: finding golang.org/x/text v0.2.0
github.com/Xuanwo/go-mod-intro
...
golang.org/x/text v0.3.0

可以发现go在查找了golang.org/x/text v0.2.0之后实际选择的还是v0.3.0,我们可以用go mod graph | grep text来看看谁在依赖这个模块:

go mod graph | grep text
github.com/Xuanwo/go-mod-intro golang.org/x/text@v0.3.0
golang.org/x/net@v0.0.0-20190311183353-d8887717615a golang.org/x/text@v0.3.0

因为golang.org/x/net在依赖golang.org/x/text@v0.3.0,所以即使我们在go.mod中强行指定了v0.2.0,最后还是会选择v0.3.0来进行构建,不仅如此,我们的go.mod文件中依赖也被修改成了v0.3.0,因为这才是我们依赖的最终版本。

下面我们来试一下如果指定成v0.3.2会如何:

go list -m all
go: finding golang.org/x/text v0.3.2
github.com/Xuanwo/go-mod-intro
...
golang.org/x/text v0.3.2

显然的,v0.3.2 > v0.3.0,所以最后选择了 v0.3.2

go mod依赖多个版本

最小版本选择算法:https://zhuanlan.zhihu.com/p/59549613

replace

replace directives provide additional control in the top-level go.mod for what is actually used to satisfy a dependency found in the Go source or go.mod files, while replace directives in modules other than the main module are ignored when building the main module.

KdAdsNewRecallServer(go.mod)依赖nfalib(go.mod),nfalib依赖attaapi_go(go.mod),因此KdAdsNewRecallServer间接依赖attaapi_go。在KdAdsNewRecallServer(go.mod) require中不需要引入attaapi_go,对attaapi_go进行replace:

replace git.code.oa.com/atta/attaapi_go => ../attaapi_go

然后go list -m all | grep atta:

go list -m all | grep atta
输出结果:
git.code.oa.com/atta/attaapi_go v1.6.5 => ../attaapi_go

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至yj.mapple@gmail.com

文章标题:go mod基本命令

文章字数:811

本文作者:melonshell

发布时间:2020-06-19, 10:50:34

最后更新:2020-09-28, 00:49:43

原始链接:http://melonshell.github.io/2020/06/19/go15_mod_cmd/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

相册