【Go学习】一文彻底搞懂go mod使用
<div class="summary">jquery中文网为您提供一文彻底搞懂go mod使用等资源,欢迎您收藏本站,我们将为您提供最新的一文彻底搞懂go mod使用资源</div><div id="con_all"> </div>
<div id="c_info" class="c_info">
<p id="main-toc"><strong>目录</strong></p>
<p id="一、如何使用go mod-toc">一、如何使用go mod</p>
<p id="二、golang开启mod后import报红解决-toc">二、golang开启mod后import报红解决</p>
<p id="三、go mod 怎么导入本地其它项目的包?-toc">三、go mod 怎么导入本地其它项目的包?</p>
<p id="四、完整代码-toc">四、完整代码</p>
<hr id="hr-toc">
<h1 id="一、如何使用go mod">一、如何使用go mod</h1>
<p>下面的函数中使用了iris,所以我们需要先使用go mod下载相关依赖,直接使用go get命令太慢了,还可能被墙~~</p>
<p>【此时项目可以放在任意位置,不必非要放在GOPATH目录下】</p>
<ul>
<li><strong>test.go</strong></li>
</ul>
<pre><code class="language-Go">package main
import (
iris "github.com/kataras/iris/v12"
)
func main() {
app := iris.New()
app.Get("/", func(ctx iris.Context) {
ctx.HTML("<h1>Hello World!</h1>")
})
app.Run(iris.Addr(":8080"))
}</code></pre>
<p><strong>1、打开CMD命令提示框,设置临时环境变量</strong></p>
<ul>
<li>set GO111MODULE=on</li>
<li>set GOPROXY=https://goproxy.io</li>
</ul>
<p>注意 https://goproxy.io 也可替换成阿里云的 https://mirrors.aliyun.com/goproxy</p>
<p><strong>2、再次执行 go get github.com/kataras/iris 也可以加 -v -u ,如下</strong></p>
<ul>
<li> go get -u github.com/kataras/iris/v12@latest</li>
</ul>
<p> 这时候就把所有的依赖都下载下来了。</p>
<p>值得注意的是,这些包并没有下载到 GOPATH/src 目录下,而是在 GOPATH/pkg/mod 目录中。</p>
<p id="2、在iris目录下使用初始化生成go.mod 文件"><strong>3、使用初始化生成<code>go.mod</code> 文件</strong></p>
<ul>
<li><code>go mod init</code> 初始化生成go.mod文件</li>
<li>
<p>go mod tidy 加载module->go.mod</p>
</li>
</ul>
<p><img src="http://p1.jquerycn.cn/gobea/f/a/fa20503de6e0686603e7a636e766e4f6.png"></p>
<p><strong>4、添加依赖运行</strong></p>
<ul>
<li>执行 <code>go run test.go</code> 运行代码会发现 go mod 会自动查找依赖自动下载</li>
</ul>
<p><img src="http://p1.jquerycn.cn/gobea/6/f/6f78eba8cd4f0a984d748a2262207c1c.jpg"></p>
<p>5、再次运行主函数</p>
<p><code>go run test.go</code> ,访问http://localhost:8080/:</p>
<p><img src="http://p1.jquerycn.cn/gobea/9/7/971945d8d704fab9f976d65a86fdd566.png"></p>
<p>go mod更加详细的使用可参考我的另一篇博客:</p>
<ul>
<li>go下载安装使用web框架iris go mod使用:https://blog.csdn.net/qq_38151401/article/details/105739028</li>
</ul>
<h1 id="二、golang开启mod后import报红解决">二、golang开启mod后import报红解决</h1>
<p>在golang中,开启mod模式后,import包变红,但是程序可以正常运行</p>
<p>如下所示:</p>
<p><img src="http://p1.jquerycn.cn/gobea/a/0/a062cff27d5806d97d23add80dff86ae.png"></p>
<p>猜测是索引路径出了问题,当前项目的依赖路径如下,可以看到只有sdk和GOPATH,没有go mod模块</p>
<p><img src="http://p1.jquerycn.cn/gobea/7/0/700d2e9eef32c2ed3fb4cc70f8331c82.png"></p>
<p>新建go项目,然后老老实实的go mod init [项目名],然后go build拉包,一切正常,这时,在setting里再启用go mod勾选上</p>
<p><img src="http://p1.jquerycn.cn/gobea/a/5/a5a8179f56bc9589cac0453f2a2a3b12.jpg"></p>
<p>然后,奇迹出现了,我们的依赖中,多了一个go mod路径,<strong>这时原来报红的import路径消失了!!!</strong></p>
<p><img src="http://p1.jquerycn.cn/gobea/f/2/f26e3a67fa7d59c997667d7fcdca0745.png"></p>
<h1 id="三、go mod 怎么导入本地其它项目的包?">三、go mod 怎么导入本地其它项目的包?</h1>
<p>通过上图中的引入依赖可以清晰地看到,我们<strong>启用go mod后</strong>,很明显的由GOPATH路径变成了go mod路径</p>
<p>也就是说,之前的<strong>基于GOPATH的路径访问方式不管用</strong>了,并且go mod不支持相对路径的引入方式,这个时候如果要引入其他模块,怎么做呢?</p>
<p>GOPATH和GOROOT<strong>更</strong>加详细的理解可参考我的另一篇博客:</p>
<ul>
<li>彻底搞懂golang的GOROOT和GOPATH:https://blog.csdn.net/qq_38151401/article/details/105729884</li>
</ul>
<p>项目结构如下所示,需要在modelDemo模块中引入model模块</p>
<p><img src="http://p1.jquerycn.cn/gobea/c/b/cb853797d9ada177d51b4ecbc043df78.png"></p>
<p>hellodemo.go是应用的入口,main 所在位置,而model可以理解为你写的一个公共的库,其中提供了一个函数 Hello()。现在,要在 hellodemo.go中调用 model中的 Hello() 函数。传统的方式是基于GOPATH或者相对路径的方式,但go mod均不支持,那如何解决呢?</p>
<p><strong>1、model模块中的 go.mod</strong> 内容如下:</p>
<p>(在model目录下运行go mod init生成go.mod文件)</p>
<p><img src="http://p1.jquerycn.cn/gobea/0/a/0a7f3230fa946c41683870083d6c5350.png"></p>
<p><strong>2、model模块中的mymodel.go</strong> 内容如下:</p>
<p><img src="http://p1.jquerycn.cn/gobea/0/b/0b4da72d395847b082081ad33bc7c558.png"></p>
<p><strong>3、modelDemo模块中的 go.mod</strong> 内容如下:</p>
<p>(在modeldemo目录下运行go mod init生成go.mod文件)</p>
<p><img src="http://p1.jquerycn.cn/gobea/d/d/dd8b556a8eb00e9fe78962285a6cb4fe.png"></p>
<p>go.mod 提供了<code>module</code>, <code>require</code>、<code>replace</code>和<code>exclude</code> 四个命令</p>
<ul>
<li><code>module</code> 语句指定包的名字(路径)</li>
<li><code>require</code> 语句指定的依赖项模块</li>
<li><code>replace</code> 语句可以替换依赖项模块</li>
<li><code>exclude</code> 语句可以忽略依赖项模块</li>
</ul>
<p>现需要引入model模块</p>
<p><img src="http://p1.jquerycn.cn/gobea/9/6/9659097aa828769c25abf9407111d3bd.png"></p>
<p> </p>
<p>此处的 replac稍微介绍下,之所以要是 github.com/model 的格式,是因为在 go1.13 中, go module 名称规范要求路径的第一部分必须满足域名规范,否则可能汇报类似 <code>malformed module path "model": missing dot in first path element</code> 这样的错误。当然,在 go1.12 不会有报这个错误。建议的话,如果是公司内部使用,可以替换成公司内部域名。</p>
<p>引入上面的replace内容侯,再次运行hellodemo.go,就会自动生成上面的require内容</p>
<p>replace 的第二个参数指定了不从远程获取,而是本地某个路径下的模块替换 github.com/model。</p>
<p><strong>4、hellodemo.go</strong>内容如下:</p>
<p><img src="http://p1.jquerycn.cn/gobea/b/b/bb9dd266daf1a61a8b43e0c17ab2370b.jpg"></p>
<p> </p>
<p>此时,执行 go run hellodemo.go 是可以成功运行的。</p>
<h1 id="四、完整代码">四、完整代码</h1>
<p>1、model -> mymodel.go</p>
<pre><code class="language-Go">package model
func Hello() string {
return "Hello"
}</code></pre>
<p>2、model -> go.mod</p>
<pre><code>module Demo/model
go 1.14
</code></pre>
<p>3、helloDemo -> hellodemo.go</p>
<pre><code class="language-Go">package main
import (
"fmt"
"github.com/model"
)
func main(){
fmt.Println("Hello")
fmt.Println(model.Hello())
}
</code></pre>
<p>4、helloDemo -> go.mod</p>
<pre><code>module Demo/modelDemo
go 1.14
require github.com/model v0.0.0-00010101000000-000000000000 // indirect
replace github.com/model => ../model</code></pre>
<p> </p>
<p>参考文章:</p>
<ul>
<li>golang开启mod后import报红解决:https://zhuanlan.zhihu.com/p/93508676</li>
<li>Go Module 引入本地自定义包:http://www.r9it.com/20190611/go-mod-use-dev-package.html</li>
<li>go mod 怎么导入本地其它项目的包?:https://segmentfault.com/q/1010000020696591</li>
</ul>
</div>
</div>
<div id="MySignature" role="contentinfo">
作者:gtea
博客地址:https://www.cnblogs.com/gtea<br><br>
来源:https://www.cnblogs.com/gtea/p/15608898.html
頁:
[1]