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

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

GOPATH

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

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

go install命令

2020062310470442.pnggoinstall和中Go-常用命令go的使用(build、env、run、fmt等)的go build很类似。go install 只是将编译的中间文件放在GOPATH的 pkg 目录下,以及固定地将编译结果放在 GOPATH 的 bin 目录下。

这个命令在内部实际上分成了两步操作:

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

govendor

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

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

                                               govendor命令

                          image.png

go mod

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

配置

2020062310470442.png

2020062310470442.png

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

                    image.png

使用命令

根目录下生成go.mod文件

go mod init "包名"

使用

GoLand

2020062310470442.png

GOPROXY介绍

Proxy,对应GOPROXY环境变量

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

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

项目目录

2020062310470442.png

  • 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 也行。

2020062310470442.png

远程包

go get命令

使用

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

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

2020062310470442.png

远程包格式如下

20210104203500268.jpg

  • 网站域名:表示代码托管的网站,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

2020062310470442.png

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就自动添加了模块

2020062310470442.png

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

2020062310470442.png

运行结果

2020062310470442.png

问题

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学习总结笔记

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

相关文章
|
3月前
|
Go 开发者
Go语言包的组织与导入 -《Go语言实战指南》
本章详细介绍了Go语言中的包(Package)概念及其使用方法。包是实现代码模块化、复用性和可维护性的核心单位,内容涵盖包的基本定义、命名规则、组织结构以及导入方式。通过示例说明了如何创建和调用包,并深入讲解了`go.mod`文件对包路径的管理。此外,还提供了多种导入技巧,如别名导入、匿名导入等,帮助开发者优化代码结构与可读性。最后以表格形式总结了关键点,便于快速回顾和应用。
178 61
|
2月前
|
JSON 中间件 Go
Go语言实战指南 —— Go中的反射机制:reflect 包使用
Go语言中的反射机制通过`reflect`包实现,允许程序在运行时动态检查变量类型、获取或设置值、调用方法等。它适用于初中级开发者深入理解Go的动态能力,帮助构建通用工具、中间件和ORM系统等。
223 63
|
1月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
170 0
|
4月前
|
Go 持续交付 开发者
Go语言包与模块(module)的基本使用-《Go语言实战指南》
本章深入讲解Go语言中的包(Package)和模块(Module)概念。包是代码组织的最小单位,每个`.go`文件属于一个包,通过`import`实现复用;主程序包需命名为`main`。模块是Go 1.11引入的依赖管理机制,支持自动版本管理和私有/远程仓库,无需依赖GOPATH。通过实际示例,如自定义包`mathutil`和第三方模块`gin`的引入,展示其使用方法。常用命令包括`go mod init`、`go mod tidy`等,帮助开发者高效管理项目依赖。最后总结,包负责功能划分,模块实现现代化依赖管理,提升团队协作效率。
216 15
|
7月前
|
算法 测试技术 Go
Go 1.24.0 重磅发布:新特性、新工具,开发者必看!
`Go 1.24.0` 已正式发布,带来诸多改进和新特性。语言层面上,泛型类型别名现已被完全支持;性能方面,通过优化 `map` 实现和内存分配,减少了 2-3% 的 CPU 开销;工具链新增模块工具依赖跟踪及测试分析器;标准库增加了弱引用包、FIPS 140-3 合规机制等;WebAssembly 支持也得到了增强。快来下载体验吧!
388 7
|
8月前
|
Go 数据库
Go语言中的包(package)是如何组织的?
在Go语言中,包是代码组织和管理的基本单元,用于集合相关函数、类型和变量,便于复用和维护。包通过目录结构、文件命名、初始化函数(`init`)及导出规则来管理命名空间和依赖关系。合理的包组织能提高代码的可读性、可维护性和可复用性,减少耦合度。例如,`stringutils`包提供字符串处理函数,主程序导入使用这些函数,使代码结构清晰易懂。
303 11
|
9月前
|
Linux Go iOS开发
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文介绍了如何在 VSCode 中禁用点击 Go 包名时自动打开浏览器跳转到 pkg.go.dev 的功能。通过将 gopls 的 `ui.navigation.importShortcut` 设置为 &quot;Definition&quot;,可以实现仅跳转到定义处而不打开链接。具体操作步骤包括:打开设置、搜索 gopls、编辑 settings.json 文件并保存更改,最后重启 VSCode 使设置生效。
322 8
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
|
10月前
|
Go 索引
go语言使用strings包
go语言使用strings包
215 3
|
10月前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
149 3
|
10月前
|
JSON 监控 安全
go语言选择合适的工具和库
【10月更文挑战第17天】
129 2