GO 项目依赖管理:go module总结
<p>转载请注明出处:</p><h2 class="md-end-block md-heading"><span class="md-plain">1.go module介绍</span></h2>
<p class="md-end-block md-p"><span class="md-plain"> go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用<span class="md-softbreak"> <span class="md-plain">go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等 使用go module之后我们可不用将代码放置在src下<span class="md-softbreak"> <span class="md-plain">使用 go module 管理依赖后会在项目根目录下生成两个文件 go.mod(会记录当前项目的所依赖)和go.sum(记录每个依赖库的版本和哈希值)</span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain"> 包管理工具go mod具有以下特性:</span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">1)自动下载依赖包,即第三方包。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">2)自定义包无须放在GOPATH设置的路径。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">3)第三方包或自定义包写在go.mod文件中,通过go.mod文件管理包。</span></span></p>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">4)已经转移的第三方包或自定义包,在go.mod文件中使用replace替换,不需要修改代码。</span></span></p>
<p class="md-end-block md-p md-focus"><span class="md-tab"> <span class="md-plain">5)对第三方包指定版本号。</span></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">2.GO111MODULE配置</span></h2>
<p class="md-end-block md-p"><span class="md-plain"> GO111MODULE 是 Go 1.11 版本后引入的模块管理功能。使用 GO111MODULE 可以让 Go 语言项目获得更好的包管理和版本控制功能。 GO111MODULE 的配置有以下几种:</span></p>
<ol class="ol-list">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">auto:在 $GOPATH/src 之外的项目和使用了 Go 1.11 之前的依赖管理方式的项目开启模块支持,其他项目不开启。当项目在 <span class="md-pair-s"><code>GOPATH/src</code><span class="md-plain"> 目录之外,并且项目根目录有 <span class="md-pair-s"><code>go.mod</code><span class="md-plain"> 文件时,才开启 <span class="md-pair-s"><code>go module</code><span class="md-plain">。</span></span></span></span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">on:开启模块支持,无论项目是否在 $GOPATH/src 下。启用 <span class="md-pair-s"><code>go module</code><span class="md-plain">,编译时会忽略<span class="md-pair-s"><code>GOPATH</code><span class="md-plain">和<span class="md-pair-s"><code>vendor</code><span class="md-plain">文件夹,只根据<span class="md-pair-s"><code>go.mod</code><span class="md-plain">下载依赖,这种模式称作<span class="md-pair-s"><code>module-aware</code><span class="md-plain">模式,这种模式下,<span class="md-pair-s"><code>GOPATH</code><span class="md-plain">不再在<span class="md-pair-s"><code>build</code><span class="md-plain">时扮演导入的角色,但是尽管如此,它还是承担着存储下载依赖包的角色。<strong>它会将依赖包放在</strong><span class="md-pair-s"><strong><code>GOPATH/pkg/mod</code></strong><span class="md-plain"><strong>目录下</strong>。</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">off:关闭模块支持,使用 GOPATH 和 vendor 目录作为依赖管理方式。 可以通过设置环境变量 GO111MODULE 或者在项目目录中创建 go.mod 文件来配置 GO111MODULE。</span></p>
<p class="md-end-block md-p md-focus"><span class="md-pair-s"><code>GO111MODULE=off</code><span class="md-plain">: <strong>禁用 <span class="md-pair-s"><code>go module</code><span class="md-plain">,编译时会在<span class="md-pair-s"><code>vendor</code><span class="md-plain">目录下和<span class="md-pair-s"><code>GOPATH</code><span class="md-plain">目录中查找依赖包。也把这种模式叫<span class="md-pair-s"><code>GOPATH</code><span class="md-plain">模式</span></span></span></span></span></span></span></span></strong></span></span></p>
</li>
</ol>
<h2 class="md-end-block md-heading"><span class="md-plain">3.GO ROOT 与 GO PATH</span></h2>
<h4 class="md-end-block md-p"><span class="md-pair-s"><strong> GOPATH</strong></span></h4>
<p class="md-end-block md-p"><span class="md-plain"> GOPATH是Go语言的工作目录,它是一个环境变量,用于指定Go语言源代码、依赖库和可执行文件的存放位置。在Go语言中,所有的源代码都必须存放在GOPATH目录下的src子目录中,所有的依赖库和可执行文件则分别存放在GOPATH目录下的pkg和bin子目录中</span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain"> GOPATH的作用是指定Go语言源代码、依赖库和可执行文件的存放位置,并且在编译项目时自动查找相应的文件。</span></p>
<p><span class="md-pair-s"><span class="md-plain"><strong><span class="md-pair-s"><span class="md-plain"><span class="md-pair-s"><span class="md-plain"><span class="md-pair-s"><span class="md-plain"><span class="md-pair-s"><span class="md-plain"> <img src="https://img2023.cnblogs.com/blog/1110857/202306/1110857-20230618004015117-505543065.png" alt=""></span></span></span></span></span></span></span></span></strong></span></span></p>
<p> 通过go env查看go环境相关的配置,可以看到 GO111MODULE 没有设置,默认为关闭off,项目的go依赖文件下载到 go path 目录中对应的src文件夹下:</p>
<p><span class="md-pair-s"><span class="md-plain"><strong><span class="md-pair-s"><span class="md-plain"><span class="md-pair-s"><span class="md-plain"><span class="md-pair-s"><span class="md-plain"><span class="md-pair-s"><span class="md-plain"> <img src="https://img2023.cnblogs.com/blog/1110857/202306/1110857-20230618004102955-2079184759.png" alt=""></span></span></span></span></span></span></span></span></strong></span></span></p>
<h4> <span class="md-pair-s"><strong>GOROOT</strong></span></h4>
<p class="md-end-block md-p"><span class="md-plain"> GOROOT是Go语言的安装目录,它是一个环境变量,用于指定Go语言的安装路径。在Go语言中,所有的标准库都存放在GOROOT目录下的src子目录中,所有的可执行文件则存放在GOROOT目录下的bin子目录中。</span></p>
<div>
<h2 class="md-end-block md-heading md-focus"><span class="md-plain md-expand">4.环境配置设置</span></h2>
<p><span class="md-plain md-expand"> Windows 下开启 GO111MODULE 的命令为:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">set</span> GO111MODULE=<span style="color: rgba(0, 0, 0, 1)">on
</span><span style="color: rgba(0, 0, 255, 1)">set</span> GO111MODULE=auto</pre>
</div>
<p> <span class="md-plain md-expand">go 1.3版本之后,可以通过以下命令修改<span class="md-pair-s"><code>GO111MODULE</code><span class="md-plain md-expand">:</span></span></span></p>
<div class="cnblogs_code">
<pre>go env -w GO111MODULE=<span style="color: rgba(0, 0, 0, 1)">on
go env </span>-w GO111MODULE=auto</pre>
</div>
<p> linux配置</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># 开启模块支持
export GO111MODULE</span>=<span style="color: rgba(0, 0, 0, 1)">on
# 关闭模块支持
export GO111MODULE</span>=off</pre>
</div>
<h2 class="md-end-block md-heading md-focus"><span class="md-plain md-expand">5.创建go.mod文件</span></h2>
<p><span class="md-plain md-expand"> 在项目目录中执行以下命令会自动创建 go.mod 文件:</span></p>
<div class="cnblogs_code">
<pre>go mod init <module-name></pre>
</div>
<p> 其中,module-name 是你的项目名称。 管理依赖仓库: 当 GO111MODULE 开启时,Go 语言会优先从 go.mod 文件中的模块信息中获取依赖库的版本信息,如果没有找到,则会去 GOPATH 和 vendor 目录下查找依赖库。 使用 go get 命令或者直接修改 go.mod 文件来管理依赖库的版本信息。例如:</p>
<div class="cnblogs_code">
<pre># 使用 go <span style="color: rgba(0, 0, 255, 1)">get</span><span style="color: rgba(0, 0, 0, 1)"> 命令安装依赖库(会自动更新 go.mod 文件)
go </span><span style="color: rgba(0, 0, 255, 1)">get</span> -u github.com/gin-gonic/<span style="color: rgba(0, 0, 0, 1)">gin
# 直接修改 go.mod 文件
require (
github.com</span>/gin-gonic/gin v1.<span style="color: rgba(128, 0, 128, 1)">6.3</span><span style="color: rgba(0, 0, 0, 1)">
)</span></pre>
</div>
<p> 可以使用以下命令来更新依赖库:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">go mod tidy# 移除不需要的依赖库
go mod vendor# 将依赖库复制到 vendor 目录下
go mod download# 下载依赖库</span></pre>
</div>
<h2 class="md-end-block md-heading md-focus"><span class="md-plain">6.go.mod 文件说明</span></h2>
<p class="md-end-block md-p"><span class="md-plain"> 如在mygo项目的目录下,输入go mod init mygo 指令即可在mygo下创建go.mod文件</span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain"> 在mygo的go.mod中设置自定义包mpb的信息,mygo的go.mod代码如下</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">module mygo
</span><span style="color: rgba(0, 0, 255, 1)">go</span> <span style="color: rgba(128, 0, 128, 1)">1.18</span><span style="color: rgba(0, 0, 0, 1)">
require (
mpb v0.</span><span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(0, 0, 0, 1)">
)
replace mpb </span>=> ./mpb</pre>
</div>
<p class="md-end-block md-p"><span class="md-plain"> go.mod的代码说明如下:</span></p>
<p class="md-end-block md-p"><span class="md-plain"> 1)module mygo代表当前go.mod文件隶属于文件夹mygo。</span></p>
<p class="md-end-block md-p"><span class="md-plain"> 2)go 1.18代表当前Go语言的版本信息。</span></p>
<p class="md-end-block md-p"><span class="md-plain"> 3)require代表需要调用第三方包或自定义包,小括号里面一行代码代表一个包信息。</span></p>
<p class="md-end-block md-p"><span class="md-plain"> 4)mpb v0.0.0代表包的信息,mpb是包名,v0.0.0是当前包的版本信息。</span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain"> 5)replace为require的包指定新的路径地址,常用于本地自定义包或第三方包的路径迁移,例如mpb => ./mpb代表自定义包mpb为当前路径的文件夹mpb。</span></p>
<p> </p>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/zjdxr-up/p/17488589.html
頁:
[1]