GO安装及 mod vendor使用

 

软件下载

https://golang.google.cn/
https://dl.google.com/go/go1.19.3.linux-amd64.tar.gz

环境变量设置

export GOWKS=/data/wks/tpf
export GOROOT=$GOWKS/app/go
export GOBIN=$GOWKS/bin
export GOPATH=$GOWKS
export PATH=$GOROOT/bin:$GOBIN:$PATH

GOWKS是自定义的GO工作空间,GO软件安装在其app/go目录下,GOWKS同时也是GOPATH,这里面也包含项目运行的GO软件,下载的依赖包,编辑后的命令,说明文档等一切项目相关的文件。

后续若进行项目迁移,不管是GO本身版本变化,还是它的依赖包版本变化,直接将这个目录COPY走就解决了所有问题。

 

GO ENV

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct  # 国内七牛云提供

 

GO MOD

进入准备当作go模块的目录,比如esql,go mod init esql可以让这个目录实现go mod功能

以后在这个目录中下载依赖包,会自动更新mod文件,这就完成了go mod的初始化了

mkdir esql
cd esql
go mod init esql
go get -u github.com/gin-gonic/gin
go get -u github.com/lib/pq

调用稍微有些麻烦,先看看mod的好处:运行main.go会自动下载依赖包,便于统一管理,类似于java的maven,

这么一对比,对公司来说,mod就是必须的;

对不需要与他人交互的个人项目来说,mod是多余的;

调用示例

mod目录在建在$GOPATH/src目录下

cd $GOPATH/src

mkdir ol

cd ol

go mod init

 

test.go文件:

package ol
import "fmt"

func Test(){
    fmt.Println("test2")
}

 

 go.mod文件,点击"Run go mod tidy"可以加载模块,这里没有模块要加载,因此不需要点

 

 然后在其他位置调用ol模块

mkdir -p cmd/tpf

cd cmd/tpf

go mod init

然后把要引用的模块写在这个go.mod文件中,公司中的模块的格式为 域名/模块名,这个域名常见的就是github.com,这里可以改为别的域名,比如gitee.com

replace 表示将gitee.com/ol模块指向本地的"../../ol"模块

module cmd/tpf
go 1.19

require gitee.com/ol v0.0.0-00010101000000-000000000000 // indirect
replace gitee.com/ol => ../../ol

ol目录在tpf目录的上级的上级,所以写成../../ol

 

 

tpf下的测试代码

package main

import "gitee.com/ol"

func main() {
    ol.Test()
}

测试代码有一条红线,这里使用的是vscode,这表示vscode在$GOROOT,$GOPATH中找不到该模块,但这只是说vscode这个IDE不识别go mod,不代表go mod没有生效

 

 命令行运行,已经生效

 

 

 

 

go vendor

这里要求你的项目放在GOPATH/src目录下

依赖于GOPATH,可放于GOPATH/src目录下,或者GOPATH/src的项目目录下

查找顺序:从当前模块目录找vendor目录,一直找到GOPATH/src

使用:手动依赖包或自己写的模块放到vendor目录,或者mod模式下进入目录执行go mod vendor

好处:下载的依赖包随项目走,不用关心这些依赖包的版本变化导致项目不可用了

 

注意事项

go vendor是要放在gopath/src目录下的

如果gopath/src/vendor与gopath/src下存在相同的模块,则vendor目录的优先级高,即会调用vendor下的模块

而go mod的模块目录如果使用replace指定特定目录后,就不会走vendor了

如果使用go mod编辑报错同时又是个人项目,可以关闭go mod:go env -w GO111MODULE=off

没了go mod的自动下载,就将手工将下载的依赖包放到vendor下,

项目迁移时,vendor随之迁移,这样的项目也是极其稳定的,

或者像文章开始那样搭建项目,项目相关所有文件都放在$GOWKS目录下,迁移时,GO版本与其依赖包都不变化,这样就万无一失了。

 

GO MOD 使用补充总结

### 找不到mod-场景1
以web73为例,它使用了tools,而tools中使用了common, 在go build 编辑web73时,找不到common,
这里在web73的go.mod中添加
replace gitee.com/tanpf/common => ../../common
明确指出common去本地的哪个地方找,不需要再添加require

### 自动添加mod需要的包

cmd/web73实际只引用了tools,web73两个包,而tools里面引用了common,以及其他一堆从网上下载的包,

此时手动添加无疑增人烦恼,鼠标点击“Run go mod tidy”就自动将关联的模块添加进来了

有时会出现找不到包的情况,手动再添加一个repalce就可以了

 命令行方式:go mod tidy

 

 ### mod下生成vendor

点击“Create vendor directory”这个按钮,就自动在当前的mod模块下生成了vendor目录

通常打包上线或给别人时生成一下,万一别人网络不可用,或者某某代码闭源了,项目也一样运行

命令行方式,go mod 开启时,执行

go mod tidy

go mod vendor

没有使用go mod的时候,下载并编辑项目github.com/kardianos/govendor,生成一个govendor

go get -u -v github.com/kardianos/govendor

go mod init
go mod tidy
go build

 


govendor用法
govendor init
初始化vendor目录

govendor add +external
添加外部依赖

govendor update +external
更新外部依赖

govendor update $PACKAGE_NAME
更新指定包的依赖

 

 

 

设置快捷键

常用的命令拼接成别名,方便使用

alias ingo="cd /data/wks/tpf/src"
alias gob="/data/wks/tpf/src/scripts/build.sh"

alias token="/opt/dbmng/scripts/cron_os/get_token.sh"

posted @ 2022-11-17 11:36  方诚  阅读(2846)  评论(0编辑  收藏  举报