美文网首页
go module文章

go module文章

作者: 千沙qiansha | 来源:发表于2020-12-05 00:13 被阅读0次

    https://www.cnblogs.com/chnmig/p/11806609.html

    go module 基本使用

    前言#

    go的版本以至1.13,一直以来令人诟病的依赖管理也有了官方的方向,但是看了一下目前很多blog文章还是比较老的.

    所以这里对 go mod 做一个大致的说明

    正文#

    前提#

    go版本为1.13及以上

    官方文档#

    如果你想更深层次的了解GO MODULE的意义及开发者们的顾虑,可以直接访问官方文档(EN)

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">https://github.com/golang/go/wiki/Modules</pre>

    go module介绍#

    go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用

    go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等

    使用go module之后我们可不用将代码放置在src下了

    具体的请往下看

    开启go module#

    go在1.13版本默认是auto,代表 当项目在 GOPATH/src 外且项目根目录有 go.mod 文件时,开启 go module.

    也就是说,如果你不把代码放置在 GOPATH/src 下则默认使用 MODULE 管理.

    不好意思看错了,1.13+的版本判断开不开启MODULE的依据是根目录下有没有go.mod文件

    我们也可手动更改为 on(全部开启)/off(全部不开启)

    这里演示设置为 on

    windows:

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">set GO111MODULE=on</pre>

    mac:

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">export GO111MODULE=on</pre>

    然后输入

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">go env</pre>

    查看 GO111MODULE 选项

    为 on 代表修改成功

    GO PROXY#

    go module 的目的是依赖管理,所以使用 go module 时你可以舍弃 go get 命令(但是不是禁止使用, 如果要指定包的版本或更新包可使用go get,平时没有必要使用)

    因go的网络问题, 所以推荐使用 goproxy.cn 设置详见

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md</pre>

    初始化#

    为你的项目第一次使用 GO MODULE(项目中还没有go.mod文件)

    进入你的项目文件夹

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">cd xxx/xxx/test/</pre>

    初始化 MODULE

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">go mod init test(test为项目名)</pre>

    我们会发现在项目根目录会出现一个 go.mod 文件

    注意,此时的 go.mod 文件只标识了项目名和go的版本,这是正常的,因为只是初始化了

    检测依赖#

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">go mod tidy</pre>

    tidy会检测该文件夹目录下所有引入的依赖,写入 go.mod 文件

    写入后你会发现 go.mod 文件有所变动

    例如:

    [ 复制代码

    ](javascript:void(0); "复制代码")

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">module test

    go 1.13 require (
    github.com/gin-contrib/sessions v0.0.1 github.com/gin-contrib/sse v0.1.0 // indirect
    github.com/gin-gonic/gin v1.4.0 github.com/go-redis/redis v6.15.6+incompatible
    github.com/go-sql-driver/mysql v1.4.1 github.com/golang/protobuf v1.3.2 // indirect
    github.com/jinzhu/gorm v1.9.11 github.com/json-iterator/go v1.1.7 // indirect
    github.com/kr/pretty v0.1.0 // indirect
    github.com/mattn/go-isatty v0.0.10 // indirect
    github.com/sirupsen/logrus v1.2.0 github.com/ugorji/go v1.1.7 // indirect
    golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae // indirect
    gopkg.in/yaml.v2 v2.2.4 )</pre>

    [ 复制代码

    ](javascript:void(0); "复制代码")

    此时依赖还是没有下载的

    下载依赖#

    我们需要将依赖下载至本地,而不是使用 go get

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">go mod download</pre>

    如果你没有设置 GOPROXY 为国内镜像,这步百分百会夯住到死

    此时会将依赖全部下载至 GOPATH 下,会在根目录下生成 go.sum 文件, 该文件是依赖的详细依赖, 但是我们开头说了,我们的项目是没有放到 GOPATH 下的,那么我们下载至 GOPATH 下是无用的,照样找不到这些包

    导入依赖#

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">go mod vendor</pre>

    执行此命令,会将刚才下载至 GOPATH 下的依赖转移至该项目根目录下的 vendor(自动新建) 文件夹下

    image

    此时我们就可以使用这些依赖了

    GOLAND设置开启 GO MODULE#

    可能是因为 GO MODULE 功能还需完善,GOLAND默认是关闭该功能的,我们需要手动打开(不排除之后更新会不会改成默认开启)

    image

    依赖更新#

    这里的更新不是指版本的更新,而是指引入新依赖

    依赖更新请从检测依赖部分一直执行即可,即

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">go mod tidy
    go mod download
    go mod vendor</pre>

    新增依赖#

    有同学会问,不使用 go get ,我怎么在项目中加新包呢?

    直接项目中 import 这个包,之后更新依赖即可

    在协作中使用 GOMODULE#

    要注意的是, 在项目管理中,如使用git,请将 vendor 文件夹放入白名单,不然项目中带上包体积会很大

    git设置白名单方式为在git托管的项目根目录新建 .gitignore 文件

    image

    设置忽略即可.

    但是 go.mod 和 go.sum 不要忽略

    另一人clone项目后在本地进行依赖更新(同上方依赖更新)即可

    GOMODULE常用命令#

    [ 复制代码

    ](javascript:void(0); "复制代码")

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: inherit !important; font-size: 15px !important; color: rgb(171, 178, 191);">go mod init # 初始化go.mod
    go mod tidy # 更新依赖文件
    go mod download # 下载依赖文件
    go mod vendor # 将依赖转移至本地的vendor文件
    go mod edit # 手动修改依赖文件
    go mod graph # 打印依赖图
    go mod verify # 校验依赖</pre>

    相关文章

      网友评论

          本文标题:go module文章

          本文链接:https://www.haomeiwen.com/subject/hauwwktx.html