goland导包配置

  • Post author:
  • Post category:其他




Go 包管理详解



包管理简介

为了解决 Golang 依赖问题,类似于 Rust 的 Cargo、Node.js 的 NPM、Python 的 Pip、Ruby 的 Boundler 等,Golang 最原始的依赖管理是 go get,执行命令后会拉取代码放入 GOPATH/src 下面,但是它是作为 GOPATH 下全局的依赖,并且 go get 还不能版本控制,以及隔离项目的包依赖。

对于以上这些问题,在go mod出现之前,有dep,govendor等包管理工具的出现,但都多多少少存在缺陷。

从 Go 1.11 版本开始,官方已内置了更为强大的 Go modules 来一统多年来 Go 包依赖管理混乱的局面(Go 官方之前推出的 dep 工具也几乎胎死腹中),并且将在 1.13 版本中正式默认开启,目前已受到社区的看好和强烈推荐,建议新项目采用 Go modules。作为新入局go的同学,可以跳过旧的包管理,直接了解和使用go modules机制(即go mod系列命令)来管理包。



GO111MODULE

golang提供了一个环境变量“GO111MODULE”,默认值为auto,如果当前目录里有 go.mod 文件,就使用 go modules,否则使用旧的 GOPATH 和 vendor 机制,因为在modules机制下go get只会下载go modules。

modules和传统GOPATH不同,不需要包含src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为module,只要其中包含go.mod文件。

除了go.mod之外,go命令还维护一个名为go.sum的文件,其中包含特定模块版本内容的预期加密哈希,go命令使用go.sum文件确保这些模块的未来下载检索与第一次下载相同的位,以确保项目所依赖的模块不会出现意外更改,无论是出于恶意、意外还是其他原因。 go.mod和go.sum都应检入版本控制。

go.sum不需要手工维护,但是也可以了解一下,下面会进行介绍。



包查找顺序总结

  • 如果GO111MODULE=off,那么go命令行将不会使用新的module功能,相反的,它将会在vendor目录下和GOPATH目录中查找依赖包。也把这种模式叫GOPATH模式。
  • 如果GO111MODULE=on,那么go命令行就会使用modules功能,而不会访问GOPATH。也把这种模式称作module-aware模式,这种模式下,GOPATH不再在build时扮演导入的角色,但是尽管如此,它还是承担着存储下载依赖包的角色。它会将依赖包放在GOPATH/pkg/mod目录下。
  • 如果GO111MODULE=auto,这种模式是默认的模式,也就是说在你不设置的情况下,就是auto。这种情况下,go命令行会根据当前目录来决定是否启用module功能。只有当当前目录在GOPATH/src目录之外而且当前目录包含go.mod文件或者其子目录包含go.mod文件才会启用。

通俗的讲:

GO111MODULE=auto,即默认情况,当然=on与=off也包含在下述情况中:

  1. 没go.mod文件时,属于GOPATH模式,则使用 vendor 特性
  2. 有go.mod文件时,此时默认启用 modules特性

    • 找当前目录,不找GOPATH/src目录
    • 当前目录下有vendor目录,则查找当前目录下vendor是否有此包;
    • 当前目录下没有vendor目录,则查找GOROOT/src下是否有此包;
    • 如果未找到,则启动GOPROXY特性,到仓库下载此包;
    • 如果未下载到则提示包不存在;

包顺序:标准库 -> 项目内包 -> 内部第三方 -> 外部第三方包



具体配置方式



方式一、使用gopath

最原始的方式,也就是将项目文件创建在环境变量中配置的GOPATH中

image-20210701163851590
image-20210701164110862

在项目文件下创建 bin src pkg文件

src下面放置源文件

注意点


如果使用如上方式必须保证GO111MODULE=off



方式二、配置go module

使用go mod 管理项目,就不需要非得把项目放到GOPATH指定目录下,你可以在你磁盘的任何位置新建一个项目,包含go.mod文件的目录也被称为模块根,也就是说,go.mod 文件的出现定义了它所在的目录为一个模块



1、通过new project方式

若是通过new project方式则为普通项目想要使用go mod管理包需要进行如下操作

首先在终端执行如下代码

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

是否成功可以使用go env查询

image-20210701170017593

初始化go mod 在终端执行

go mod init text

执行完成之后会形成一个go.mod文件



注意点
  • 保证gopath中没有配置路径

image-20210701171027311

  • go module中下图地方必须勾上



2、使用 Go modules创建项目

image-20210701171629345

什么也不用干,软件会帮你全部弄好



版权声明:本文为abc1954607060原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。