go包管理

2020-08-09  本文已影响0人  chase_lwf

内容

1 gvm管理go版本
2 git submodule
3 go mod

gvm使用

1 安装gvm

bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

2 gvm管理go 版本
前言:使用gvm可以方便的切换各个go版本,在使用go mod之前,项目的依赖的第三方包是房子GOPATH的pkg目录下的,gvm不同的版本所管理的gopath是不一样的,所以切换版本后,path也相应切换

1 gvm listall // 查看所有的go版本
2 gvm install go1.14 // 安装go1.14版本
3 gvm list // 查看当前使用的go version
   go1.12.9
=> go1.14    //当前使用1.14
   system
4 gvm use go1.12.9 // 切换到使用1.12版本
Now using version go1.12.9

3 gvm管理项目依赖的第三方包

gvm pkgset list //查看当前版本使用的包路径, 当前版本使用的默认global包
gvm go package sets (system)
=>  global

$ echo $GOPATH
/Users/genewfli/.gvm/pkgsets/system/global

gvm pkgset create mypkg // 建立一个自己的mypkg,每个项目一个对应的pkgset
gvm pkgset use mypkg  // 当前版本使用mypkg这个路径充当gopath, 这个样就完成了项目依赖的第三方存储路径的隔离,不同项目使用不同pkgset来存储第三方依赖包

gvm pkgenv mypkg // 查看当前pkg的go env 配置 注意:注意idea里的设置的gopath不一样的话,通过idea go get的包的路径要注意一下,可能就不是在pkgenv 里的go path 里了

git submodule

1 项目中通过submodule添加一个子项目依赖

git submodule add https://github.com/B.git usr/plugins/BaiduSubmit
格式:git submodule 子项目url 子项目在父项目的地址

2 克隆一个有子项目的项目

git clone xxx.git // git clone父项目后还需要初始化submodule

# 初始化子模块
git submodule init

# 将子模块的文件check出来
git submodule update

3 修改子项目并提交子项目

# 首先,我们进入子模块
cd xx/xx/sub

# 检出master分支「子项目是游离状态,进入后需要checkout到想要提交分支」
git checkout master

# 然后做修改
vim some-file.py

# 最后做提交
git add .
git commit -m "Get something done"
git push origin master

4 别人更新了submodule项目,想要把别人的变更更新到父项目

# 首先,我们进入子模块
cd xx/xx/sub

# 检出master分支
git checkout master

# 然后拉取更新
git pull

# 回到父项目中更新
cd ../../

git add xx/xx/xx
git commit -m "update submodule"

5 如何将submodule的变更在父项目中提交

// 子项目被提交后,在父项目中会感应到
git status
# modified:   xx/xxxx/xxxx (new commits)

# add的时候注意再最后不要加 / 斜杠,否则会出现很棘手问题
git add xx/xxxx/xxxx
git commit -m "update submodule"
git push

详细参考:https://blog.phpgao.com/git_submodule.html

go mod

1 前言
go mod是go 12版本正式推出的管理依赖包的新特性,到13版后已经默认启动go mod了,取代了以前去go path下面寻找依赖的方式,让项目之间依赖隔离管理更方便
2 go mod 命令和关键参数
2.1 关键参数
GO111MODULE

GO111MODULE =auto/on/off, GO111MODULE有三个可选值
auto
go < 1.13
当前目录或父辈目录有 go.mod 文件,且目录在 $GOPATH/src 外:才使用 module 模式
go >= 1.13
当前目录或父辈目录有 go.mod 文件,即使目录在 $GOPATH/src 内:都使用 module 模式
on: 不管什么时候,都使用 module 模式
off: 不管什么时候,都不使用 module 模式

GOPROXY

用途:提供代理获取 Golang 模块源码的功能。
默认值:`proxy.golang.org,direct` ([参考](https://github.com/golang/go/blob/master/src/cmd/go/internal/cfg/cfg.go#L248))
格式([参考](https://github.com/golang/go/blob/master/src/cmd/go/internal/modfetch/proxy.go#L113)):`<proxyURL01>,<proxyURL02>,direct` 或 [off](https://golang.org/doc/go1.13#modules)
    允许以英文逗号 `,` 分隔设置多个代理地址,多个地址中,优先从第 1 个代理开始获取模块源码,若失败则尝试后面的地址
    `direct`:表示不使用代理,直接从源码仓库获取
    `proxy.golang.org,direct`:表示优先从 `proxy.golang.org` 获取,若失败,则直接从源码仓库获取(`direct`)
    `off`:表示一开始就不从任何代理下载模块,只从模块本身源码网站下载

第三方可用代理:
       [官方:proxy.golang.org](http://km.oa.com/group/19253/articles/show/402096#%E5%AE%98%E6%96%B9-proxy-golang-org)
       [七牛云:goproxy.cn](http://km.oa.com/group/19253/articles/show/402096#%E4%B8%83%E7%89%9B%E4%BA%91-goproxy-cn)
       [腾讯云:mirrors.tencent.com/go](http://km.oa.com/group/19253/articles/show/402096#%E8%85%BE%E8%AE%AF%E4%BA%91-mirrors-tencent-com-go)
       [阿里云:mirrors.aliyun.com/goproxy](http://km.oa.com/group/19253/articles/show/402096#%E9%98%BF%E9%87%8C%E4%BA%91-mirrors-aliyun-com-goproxy)
       [百度:goproxy.baidu.com](http://km.oa.com/group/19253/articles/show/402096#%E7%99%BE%E5%BA%A6-goproxy-baidu-com)

GOSUMDB

GOPRIVATE

2.2 go mod 命令

go mod download: download modules to local cache(下载依赖包)
go mod edit: edit go.mod from tools or scripts(编辑go.mod
go mod graph: print module requirement graph (打印模块依赖图)
go mod init: initialize new module in current directory(在当前目录初始化mod)
go mod tidy: add missing and remove unused modules(拉取缺少的模块,移除不用的模块)
go mod vendor: make vendored copy of dependencies(将依赖复制到vendor下)
go mod verify: verify dependencies have expected content (验证依赖是否正确)
go mod why: explain why packages or modules are needed(解释为什么需要依赖)
上一篇 下一篇

猜你喜欢

热点阅读