软件下载
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"