go module 基本使用
<h2>前言</h2><p>go的版本以至1.13,一直以来令人诟病的依赖管理也有了官方的方向,但是看了一下目前很多blog文章还是比较老的.</p>
<p>所以这里对 go mod 做一个大致的说明</p>
<h2>正文</h2>
<h3>前提</h3>
<p>go版本为1.13及以上</p>
<h3>官方文档</h3>
<p>如果你想更深层次的了解GO MODULE的意义及开发者们的顾虑,可以直接访问官方文档(EN)</p>
<div class="cnblogs_code">
<pre>https://github.com/golang/go/wiki/Modules</pre>
</div>
<h3>go module介绍</h3>
<p>go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用</p>
<p>go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等</p>
<p><span style="background-color: rgba(255, 255, 255, 1); color: rgba(255, 0, 0, 1)">使用go module之后我们可不用将代码放置在src下了</span></p>
<p>具体的请往下看</p>
<h3>开启go module</h3>
<p>go在1.13版本默认是auto,代表 <span style="text-decoration: line-through">当项目在 GOPATH/src 外且项目根目录有 go.mod 文件时,开启 go module.</span></p>
<p><span style="text-decoration: line-through">也就是说,如果你不把代码放置在 GOPATH/src 下则默认使用 MODULE 管理.</span></p>
<p>不好意思看错了,1.13+的版本判断开不开启MODULE的依据是根目录下有没有go.mod文件</p>
<p>我们也可手动更改为 on(全部开启)/off(全部不开启)</p>
<p>这里演示设置为 on</p>
<p>windows:</p>
<div class="cnblogs_code">
<pre>set GO111MODULE=on</pre>
</div>
<p>mac:</p>
<div class="cnblogs_code">
<pre>export GO111MODULE=on</pre>
</div>
<p>然后输入</p>
<div class="cnblogs_code">
<pre>go env</pre>
</div>
<p>查看 GO111MODULE 选项</p>
<p>为 on 代表修改成功</p>
<h3>GO PROXY</h3>
<p>go module 的目的是依赖管理,所以使用 go module 时你可以舍弃 go get 命令(但是不是禁止使用, 如果要指定包的版本或更新包可使用go get,平时没有必要使用)</p>
<p>因go的网络问题, 所以推荐使用 goproxy.cn 设置详见</p>
<div class="cnblogs_code">
<pre>https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md</pre>
</div>
<h3>初始化</h3>
<p>为你的项目第一次使用 GO MODULE(项目中还没有go.mod文件) </p>
<p>进入你的项目文件夹</p>
<div class="cnblogs_code">
<pre>cd xxx/xxx/test/</pre>
</div>
<p>初始化 MODULE</p>
<div class="cnblogs_code">
<pre>go mod init test(test为项目名)</pre>
</div>
<p>我们会发现在项目根目录会出现一个 go.mod 文件</p>
<p>注意,此时的 go.mod 文件只标识了项目名和go的版本,这是正常的,因为只是初始化了</p>
<h3>检测依赖</h3>
<div class="cnblogs_code">
<pre>go mod tidy</pre>
</div>
<p>tidy会检测该文件夹目录下所有引入的依赖,写入 go.mod 文件</p>
<p>写入后你会发现 go.mod 文件有所变动</p>
<p>例如:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">module test
go </span>1.13<span style="color: rgba(0, 0, 0, 1)">
require (
github.com</span>/gin-contrib/sessions v0.0.1<span style="color: rgba(0, 0, 0, 1)">
github.com</span>/gin-contrib/sse v0.1.0 //<span style="color: rgba(0, 0, 0, 1)"> indirect
github.com</span>/gin-gonic/gin v1.4.0<span style="color: rgba(0, 0, 0, 1)">
github.com</span>/go-redis/redis v6.15.6+<span style="color: rgba(0, 0, 0, 1)">incompatible
github.com</span>/go-sql-driver/mysql v1.4.1<span style="color: rgba(0, 0, 0, 1)">
github.com</span>/golang/protobuf v1.3.2 //<span style="color: rgba(0, 0, 0, 1)"> indirect
github.com</span>/jinzhu/gorm v1.9.11<span style="color: rgba(0, 0, 0, 1)">
github.com</span>/json-iterator/go v1.1.7 //<span style="color: rgba(0, 0, 0, 1)"> indirect
github.com</span>/kr/pretty v0.1.0 //<span style="color: rgba(0, 0, 0, 1)"> indirect
github.com</span>/mattn/go-isatty v0.0.10 //<span style="color: rgba(0, 0, 0, 1)"> indirect
github.com</span>/sirupsen/logrus v1.2.0<span style="color: rgba(0, 0, 0, 1)">
github.com</span>/ugorji/go v1.1.7 //<span style="color: rgba(0, 0, 0, 1)"> indirect
golang.org</span>/x/sys v0.0.0-20191025021431-6c3a3bfe00ae //<span style="color: rgba(0, 0, 0, 1)"> indirect
gopkg.</span><span style="color: rgba(0, 0, 255, 1)">in</span>/yaml.v2 v2.2.4<span style="color: rgba(0, 0, 0, 1)">
)</span></pre>
</div>
<p>此时依赖还是没有下载的</p>
<h3>下载依赖</h3>
<p>我们需要将依赖下载至本地,而不是使用 go get</p>
<div class="cnblogs_code">
<pre>go mod download</pre>
</div>
<p>如果你没有设置 GOPROXY 为国内镜像,这步百分百会夯住到死</p>
<p>此时会将依赖全部下载至 GOPATH 下,会在根目录下生成 go.sum 文件, 该文件是依赖的详细依赖, 但是我们开头说了,我们的项目是没有放到 GOPATH 下的,那么我们下载至 GOPATH 下是无用的,照样找不到这些包</p>
<h3>导入依赖</h3>
<div class="cnblogs_code">
<pre>go mod vendor</pre>
</div>
<p>执行此命令,会将刚才下载至 GOPATH 下的依赖转移至该项目根目录下的 vendor(自动新建) 文件夹下</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1268810/201911/1268810-20191106164938645-353365538.png" alt=""></p>
<p> </p>
<p> 此时我们就可以使用这些依赖了</p>
<h3>GOLAND设置开启 GO MODULE</h3>
<p>可能是因为 GO MODULE 功能还需完善,GOLAND默认是关闭该功能的,我们需要手动打开(不排除之后更新会不会改成默认开启)</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1268810/201911/1268810-20191109170029873-317649978.png" alt=""></p>
<h3>依赖更新</h3>
<p>这里的更新不是指版本的更新,而是指引入新依赖</p>
<p>依赖更新请从检测依赖部分一直执行即可,即</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">go mod tidy
go mod download
go mod vendor</span></pre>
</div>
<h3>新增依赖</h3>
<p>有同学会问,不使用 go get ,我怎么在项目中加新包呢?</p>
<p>直接项目中 import 这个包,之后更新依赖即可</p>
<h3>在协作中使用 GOMODULE</h3>
<p>要注意的是, 在项目管理中,如使用git,请将 vendor 文件夹放入白名单,不然项目中带上包体积会很大</p>
<p>git设置白名单方式为在git托管的项目根目录新建 .gitignore 文件</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1268810/201911/1268810-20191106170912821-1447852222.png" alt=""></p>
<p> </p>
<p> 设置忽略即可.</p>
<p>但是 go.mod 和 go.sum 不要忽略</p>
<p>另一人clone项目后在本地进行依赖更新(同上方依赖更新)即可</p>
<h3>GOMODULE常用命令</h3>
<div class="cnblogs_code">
<pre>go mod init<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 初始化go.mod</span>
go mod tidy<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 更新依赖文件</span>
go mod download<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 下载依赖文件</span>
go mod vendor<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 将依赖转移至本地的vendor文件</span>
go mod edit<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 手动修改依赖文件</span>
go mod graph<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 打印依赖图</span>
go mod verify<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 校验依赖</span></pre>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/chnmig/p/11806609.html
頁:
[1]