Golang之GoPath(工作目录)与Modules(包管理)的比较

Posted 刘小豆豆豆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang之GoPath(工作目录)与Modules(包管理)的比较相关的知识,希望对你有一定的参考价值。

GoPath

GOPATH 是 Go语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录。

工作目录是一个工程开发的相对参考目录,好比当你要在公司编写一套服务器代码,你的工位所包含的桌面、计算机及椅子就是你的工作区。工作区的概念与工作目录的概念也是类似的。如果不使用工作目录的概念,在多人开发时,每个人有一套自己的目录结构,读取配置文件的位置不统一,输出的二进制运行文件也不统一,这样会导致开发的标准不统一,影响开发效率。

采用go env可以查看GoPath的路径, 在程序中import导的包 通过 go get 就会下载到GoPath中。GoPath可以设置多个、按顺序查找jar包。先找GoRoot,然后按照GoPath的顺序找。

Gopath会将包文件下载到你配置的GOPATH环境变量的src文件夹下(如果没有配置modules的情况下)。

Golang默认使用GoPath来管理第三方包(类似于Java中的Jar包),GoPath 有一个很严重的问题, 当你本地开多个项目的时候,没法让不同项目对应不同的jar包版本。如果引入的jar版本是不向下兼容的话,那开发的时候都可能会出现很多问题。比如我的jar有这个方法,你的没有,很容易出问题。

像Java的maven可以配置jar版本在pom.xml中,而go也有这么个包管理工具 modules。

go mod

环境配置

在设置Go Module之前,需要先设置下环境变量:
GO111MODULE设置

  • GO111MODULE=on,go命令行会使用modules,不会去GOPATH目录下查找。
  • GO111MODULE=auto,默认值,go命令行将会根据当前目录是否包含go.mod来决定是否启用 Go modules。

配置方式: go env -w GO111MODULE=on

代理设置:go可以设置国内代理地址去快速下载依赖包

  • https://goproxy.cn
  • https://goproxy.io
  • https://mirrors.aliyun.com/goproxy/

配置方式: go env -w GOPROXY=https://goproxy.cn,direct

使用方式:

1、通过IDE可直接生成mod初始化

2、使用go mod int 模块路径进行初始化,生成go.mod文件。

go mod init hank.com/mygin 

可以看到mygin目录下生成了go.mod文件

module hank.com/mygin

go 1.14

在代码中import第三方包的时候,直接import即可,初始化完成之后,只要执行go 构建命令,go test、go build、go run,就可以自动添加新的依赖关系。

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

或者通过命令 go mod tidy 自动下载,此命令类似于Maven中的刷新, 可自动下载.mod文件中的依赖,也可剔除不需要的。

module pri_gen_mis

go 1.16

require github.com/jinzhu/gorm v1.9.16

总结:

  1. 大部分场景下 go mod init 和 go mod tidy 两个命令就够用了
  2. 查看$GOPATH/pkg/mod里面的文件就知道了,mod做了一件类似maven的事把所有包都打上了版本号。
    可以说这是 golang 迈向高大上语言的标志。
  3. 从此我们不再为多版本使用的困扰,也不再为IDE打开一个新项目后等待n分钟的生成缓存犯愁。推荐大家丢掉GoPath 使用统一管理。

以上是关于Golang之GoPath(工作目录)与Modules(包管理)的比较的主要内容,如果未能解决你的问题,请参考以下文章

golang 包结构

golang几个环境变量的问题

golang导入包的几个说明:import

golang的 GOPATH和vendor的搜索关系

golang安装

golang安装