脑子瞎的时候丶有眼睛也没用 發表於 2022-11-17 11:36:00

GO安装及 mod vendor使用

<p>&nbsp;</p>
<p>软件下载</p>
<p>https://golang.google.cn/<br>https://dl.google.com/go/go1.19.3.linux-amd64.tar.gz<br><br></p>
<p>环境变量设置</p>
<div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px; text-align: left">export GOWKS=/data/wks/tpf</div>
<div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px; text-align: left">export GOROOT=$GOWKS/app/go</div>
<div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px; text-align: left">export GOBIN=$GOWKS/bin</div>
<div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px; text-align: left">export GOPATH=$GOWKS</div>
<div style="white-space: pre-wrap; line-height: 1.75; font-size: 14px; text-align: left">export PATH=$GOROOT/bin:$GOBIN:$PATH</div>
<p>GOWKS是自定义的GO工作空间,GO软件安装在其app/go目录下,GOWKS同时也是GOPATH,这里面也包含项目运行的GO软件,下载的依赖包,编辑后的命令,说明文档等一切项目相关的文件。</p>
<p>后续若进行项目迁移,不管是GO本身版本变化,还是它的依赖包版本变化,直接将这个目录COPY走就解决了所有问题。</p>
<p>&nbsp;</p>
<p>GO ENV</p>
<p>go env -w GO111MODULE=on<br>go env -w GOPROXY=https://goproxy.cn,direct&nbsp; # 国内七牛云提供</p>
<p>&nbsp;</p>
<p><strong>GO MOD</strong></p>
<p>进入准备当作go模块的目录,比如esql,go mod init esql可以让这个目录实现go mod功能</p>
<p>以后在这个目录中下载依赖包,会自动更新mod文件,这就完成了go mod的初始化了</p>
<p>mkdir esql<br>cd esql <br>go mod init esql<br>go get -u github.com/gin-gonic/gin<br>go get -u github.com/lib/pq</p>
<p>调用稍微有些麻烦,先看看mod的好处:运行main.go会自动下载依赖包,便于统一管理,类似于java的maven,</p>
<p>这么一对比,对公司来说,mod就是必须的;</p>
<p>对不需要与他人交互的个人项目来说,mod是多余的;</p>
<p>调用示例</p>
<p>mod目录在建在$GOPATH/src目录下</p>
<p>cd $GOPATH/src</p>
<p>mkdir ol</p>
<p>cd ol</p>
<p>go mod init </p>
<p>&nbsp;</p>
<p>test.go文件:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">package ol
import </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fmt</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">

func Test(){
    fmt.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">test2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
}</span></pre>
</div>
<p><img src="https://img2023.cnblogs.com/blog/163794/202212/163794-20221201182605257-2134117358.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;go.mod文件,点击"Run go mod tidy"可以加载模块,这里没有模块要加载,因此不需要点</p>
<p><img src="https://img2023.cnblogs.com/blog/163794/202212/163794-20221201182709638-1015570120.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;然后在其他位置调用ol模块</p>
<p>mkdir -p cmd/tpf</p>
<p>cd cmd/tpf</p>
<p>go mod init</p>
<p>然后把要引用的模块写在这个go.mod文件中,公司中的模块的格式为 域名/模块名,这个域名常见的就是github.com,这里可以改为别的域名,比如gitee.com</p>
<p>replace 表示将<span style="color: rgba(0, 0, 0, 1)">gitee.com/ol模块指向本地的"../../ol"模块</span></p>
<div class="cnblogs_code">
<pre>module cmd/<span style="color: rgba(0, 0, 0, 1)">tpf
go </span><span style="color: rgba(128, 0, 128, 1)">1.19</span><span style="color: rgba(0, 0, 0, 1)">

require gitee.com</span>/ol v0.<span style="color: rgba(128, 0, 128, 1)">0.0</span>-<span style="color: rgba(128, 0, 128, 1)">00010101000000</span>-<span style="color: rgba(128, 0, 128, 1)">000000000000</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> indirect</span><span style="color: rgba(0, 0, 0, 1)">
replace gitee.com</span>/ol =&gt; ../../ol</pre>
</div>
<p>ol目录在tpf目录的上级的上级,所以写成../../ol</p>
<p><img src="https://img2023.cnblogs.com/blog/163794/202212/163794-20221201183751164-1303414447.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>tpf下的测试代码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">package main

import </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gitee.com/ol</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">

func main() {
    ol.Test()
}</span></pre>
</div>
<p>测试代码有一条红线,这里使用的是vscode,这表示vscode在$GOROOT,$GOPATH中找不到该模块,但这只是说vscode这个IDE不识别go mod,不代表go mod没有生效</p>
<p><img src="https://img2023.cnblogs.com/blog/163794/202212/163794-20221201183842778-1531967123.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;命令行运行,已经生效</p>
<p><img src="https://img2023.cnblogs.com/blog/163794/202212/163794-20221201184248192-1260503337.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>go vendor</strong></p>
<p>这里要求你的项目放在GOPATH/src目录下</p>
<p>依赖于GOPATH,可放于GOPATH/src目录下,或者GOPATH/src的项目目录下</p>
<p>查找顺序:从当前模块目录找vendor目录,一直找到GOPATH/src</p>
<p>使用:手动依赖包或自己写的模块放到vendor目录,或者mod模式下进入目录执行go mod vendor</p>
<p>好处:下载的依赖包随项目走,不用关心这些依赖包的版本变化导致项目不可用了</p>
<p>&nbsp;</p>
<p>注意事项</p>
<p>go vendor是要放在gopath/src目录下的</p>
<p>如果gopath/src/vendor与gopath/src下存在相同的模块,则vendor目录的优先级高,即会调用vendor下的模块</p>
<p>而go mod的模块目录如果使用replace指定特定目录后,就不会走vendor了</p>
<p>如果使用go mod编辑报错同时又是个人项目,可以关闭go mod:go env -w GO111MODULE=off</p>
<p>没了go mod的自动下载,就将手工将下载的依赖包放到vendor下,</p>
<p>项目迁移时,vendor随之迁移,这样的项目也是极其稳定的,</p>
<p>或者像文章开始那样搭建项目,项目相关所有文件都放在$GOWKS目录下,迁移时,GO版本与其依赖包都不变化,这样就万无一失了。</p>
<p>&nbsp;</p>
<p><strong>GO MOD 使用补充总结</strong></p>
<p>### 找不到mod-场景1<br>以web73为例,它使用了tools,而tools中使用了common, 在go build 编辑web73时,找不到common,<br>这里在web73的go.mod中添加<br>replace gitee.com/tanpf/common =&gt; ../../common<br>明确指出common去本地的哪个地方找,不需要再添加require</p>
<p>### 自动添加mod需要的包</p>
<p>cmd/web73实际只引用了tools,web73两个包,而tools里面引用了common,以及其他一堆从网上下载的包,</p>
<p>此时手动添加无疑增人烦恼,鼠标点击“Run go mod tidy”就自动将关联的模块添加进来了</p>
<p>有时会出现找不到包的情况,手动再添加一个repalce就可以了</p>
<p><img src="https://img2023.cnblogs.com/blog/163794/202212/163794-20221202103041490-336948023.png" alt="" loading="lazy"></p>
<p>&nbsp;命令行方式:go mod tidy</p>
<p>&nbsp;</p>
<p>&nbsp;### mod下生成vendor</p>
<p>点击“Create vendor directory”这个按钮,就自动在当前的mod模块下生成了vendor目录</p>
<p>通常打包上线或给别人时生成一下,万一别人网络不可用,或者某某代码闭源了,项目也一样运行</p>
<p><img src="https://img2023.cnblogs.com/blog/163794/202212/163794-20221202103414796-1469648038.png" alt="" loading="lazy"></p>
<p>命令行方式,go mod 开启时,执行</p>
<p>go mod tidy </p>
<p>go mod vendor</p>
<p>没有使用go mod的时候,下载并编辑项目github.com/kardianos/govendor,生成一个govendor</p>
<p>go get -u -v github.com/kardianos/govendor</p>
<p>go mod init<br>go mod tidy<br>go build</p>
<p>&nbsp;</p>
<p><br><strong>govendor用法</strong><br>govendor init<br>初始化vendor目录<br><br>govendor add +external<br>添加外部依赖<br><br>govendor update +external<br>更新外部依赖<br><br>govendor update $PACKAGE_NAME<br>更新指定包的依赖</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>设置快捷键</strong></p>
<p>常用的命令拼接成别名,方便使用</p>
<p>alias ingo="cd /data/wks/tpf/src"<br>alias gob="/data/wks/tpf/src/scripts/build.sh"</p>
<p>alias token="/opt/dbmng/scripts/cron_os/get_token.sh"</p><br><br>
来源:https://www.cnblogs.com/perfei/p/16898937.html
頁: [1]
查看完整版本: GO安装及 mod vendor使用