Go-包管理(管理工具对比及go mod的使用)

Posted lady_killer9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go-包管理(管理工具对比及go mod的使用)相关的知识,希望对你有一定的参考价值。

目录

GOPATH

go install命令

govendor

go mod

配置

GO111MODULE介绍

命令

使用

GOPROXY介绍

项目目录

代码

运行截图

远程包

go get命令

参考


GOPATH

  1. 代码开发必须在go path的src目录下
  2. 手动管理依赖
  3. 依赖包没有版本

全是缺点,在本地可以凑合用用

go install命令

goinstall和中Go-常用命令go的使用(build、env、run、fmt等)的go build很类似。go install 只是将编译的中间文件放在GOPATH的 pkg 目录下,以及固定地将编译结果放在 GOPATH 的 bin 目录下。
这个命令在内部实际上分成了两步操作:

  • 第一步是生成结果文件(可执行文件或者 .a 包)
  • 第二步会把编译好的结果移到 $GOPATH/pkg 或者 $GOPATH/bin。

govendor

  1. 解决了包依赖,一个配置文件即可管理
  2. 依赖包全都下载到项目vendor下,每个项目都有一份

大型项目也不行,冗余太多

govendor命令
命令功能
init初始化 vendor 目录
list列出所有的依赖包
add添加包到 vendor 目录,如 govendor add +external 添加所有外部包
add PKG_PATH添加指定的依赖包到 vendor 目录
update从 $GOPATH 更新依赖包到 vendor 目录
remove从 vendor 管理中删除依赖
status列出所有缺失、过期和修改过的包
fetch添加或更新包到本地 vendor 目录
sync本地存在 vendor.json 时候拉去依赖包,匹配所记录的版本
get类似 go get 目录,拉取依赖包到 vendor 目录

go mod

  • 一个包可以由多个文件组成
  • 同一包内不需要导入

配置

GO111MODULE介绍

有三个值:off, on和auto(默认值)。

GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
GO111MODULE=on,go命令行会使用modules,而不会去GOPATH目录下查找。
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:

当前目录在GOPATH/src之外且该目录包含go.mod文件
当前文件在包含go.mod文件的目录下面

命令

go mod
命令说明
download下载依赖包
edit编辑go.mod
graph打印模块依赖图
init初始化一个新模块到当前目录
verify在当前目录初始化mod
tidy拉取缺少的模块,移除不用的模块
vendor将依赖复制到vendor下
verify验证依赖是否正确
why解释为什么需要依赖

使用命令

根目录下生成go.mod文件

go mod init "包名"

使用

GoLand

GOPROXY介绍

Proxy,对应GOPROXY环境变量

proxy.golang.org,中国无法访问,除非你有梯子

goproxy.cn、goproxy.org可以在中国使用,“direct” 是一个特殊指示符,用于指示 Go 回源到模块版本的源地址去抓取(GitHub等),当值列表中上一个 Go 模块代理返回 404 或 410 错误时,Go 自动尝试列表中的下一个,遇见 “direct” 时回源,也就是回到源地址去抓取,而遇见 EOF 时终止并抛出 “invalid version: unknown revision...” 的错误。

项目目录

  • add.go中有可导出的函数Add
  • plus.go中使用add.go中的函数Add,来展示同一包内不需要导入
  • sub.go中使用plus.go中的Plus函数,来展示不同包下如何导入
  • Cal.go是入口文件,package后必须是main,同时含有main方法,导入了包plus和sub

代码

add.go

package plus

func Add(a,b int)int{
	return a+b
}

plus.go

package plus

func Plus(a,b int)int{
	return Add(a,b)
}

相同包直接使用

sub.go

package sub

import "modUse/plus"

func Sub(a,b,c int) int{
	return plus.Plus(a,b) - c
}

不同包需要导入

Cal.go

package main

import (
	"fmt"
	"modUse/plus"
	"modUse/sub"
)

func main()  {
	a := 10
	b := 20
	fmt.Println(plus.Plus(a,b))
	fmt.Println(sub.Sub(a,b,5))
}

main包中导入。使用go mod不用建立main目录,写上package main即可。

运行截图

编译后运行即可,go run 也行。

远程包

go get命令

使用

go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]

配置好代理,Go-常用命令go的使用(build、env、run、fmt等)中讲解env时有代理的设置。

远程包格式如下

  • 网站域名:表示代码托管的网站,github、gitee等
  • 作者或机构:表明这个项目的归属,一般为网站的用户名。
  • 项目名:每个网站下的作者或机构可能会同时拥有很多的项目,图中标示的部分表示项目名称。

 我写了一个简单的go包,实现了单链表:Go-如何优雅的实现单链表?(含全部代码)

包的网址为:https://gitee.com/frankyu365/datastructure

最新版

go get example.com/pkg

指定版本

go get example.com/pkg@版本号

删除依赖并降级

go get example.com/mod@none

更新具体的包

 go get -d golang.org/x/net

go get选项
选项含义
-v显示操作流程的日志及信息,方便检查错误
-u下载丢失的包,但不会更新已经存在的包
-d只下载更新,不安装,安装使用go install
-insecure允许使用不安全的 HTTP 方式进行下载操作

我一般使用-u -v参数

go get -u -v gitee.com/frankyu365/datastructure

Cal.go改为

package main

import (
	"fmt"
	"modUse/plus"
	"modUse/sub"
	"gitee.com/frankyu365/datastructure/singlelist"
)

func main()  {
	a := 10
	b := 20
	fmt.Println(plus.Plus(a,b))
	fmt.Println(sub.Sub(a,b,5))
	lst := singlelist.New()
	lst.PushBack(7)
	fmt.Println(lst.Front())
}

这个时候的go.mod就自动添加了模块

你可以在你的GOPATH下找到这个包

运行结果

问题

go mod缓存

参考:go module @latest found but does not contain package

发布自己的go包

创建项目

go mod init "xxx.com/username/packagename"

写代码

添加到本地仓库

git add .

添加注释

git commit -m ''

添加标签

git tag -a <版本号> -m "<备注信息>"

发布

 git push --tags origin branch

参考

go命令-命令go

更多Go相关内容:Go-Golang学习总结笔记

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。

以上是关于Go-包管理(管理工具对比及go mod的使用)的主要内容,如果未能解决你的问题,请参考以下文章

go官方包依赖管理工具之mod

Go mod包管理

go mod使用

告别GOPATH,快速使用 go mod(Golang包管理工具)

一起使用GO(golang) 来做一个后台管理系统系列10 使用mod 来管理包

Go go.mod入门