Go Modules

摘要:
Gomodule是一个正式的go项目依赖管理工具。使用模块时,GOPATH不再用于解析导入。在GoModules之前,Go开发中的依赖管理使用GOPATH开发模式。自Go1.14以来,模块支持被认为可用于生产环境,鼓励所有用户从其他依赖管理系统迁移到模块。

官方文档:https://github.com/golang/go/wiki/Modules

     https://go.dev/blog/using-go-modules

  什么是Go Modules?

    go module 是go官方自带的go项目依赖管理工具(类似于Java中的maven)。Go通过Go Modules的依赖管理统一了Go生态中众多的第三方的依赖管理。

    go moudle取代旧的基于GOPATH方法来指定在工程中使用哪些源文件或导入包 。使用module时,GOPATH 不再用于解析导入。但是,它仍然用于存储下载的源代码(在 GOPATH/pkg/mod 中)和编译的命令(在 GOPATH/bin 中)。

    go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等

    使用go module之后我们可不用将代码放置在src下了

  GOPATH的使用

    目前在Go中存在两种开发模式,GOPATH mode 和 Go Modules mode。

    在Go Modules之前,Go开发中的依赖管理使用GOPATH开发模式。在GOPATH开发模式中,Go命令使用GOPATH环境变量来实现以下几个功能:

      1)go install 命令安装二进制库到 $GOBIN,其默认路径为 $GOPATH/bin

      2)go install 命令安装编译好的包到 $GOPATH/pkg/ 中。  

        例如将example.com/y/z安装到$GOPATH/pkg/example.com/y/z.a

      3)go get 命令下载源码包到$GOPATH/src/ 中。  

        例如将example.com/y/z下载到$GOPATH/src/example

  

    在使用Go Modules 开发模式中,GOPATH变量的用处:

      1)go install 命令安装二进制到 $GOBIN目录,其默认位置为$GOPATH/bin (与GOPATH开发模式相同)

      2)go get命令缓存下载的Modules到$GOMODCACHE目录,默认位置为$GOPATH/pkg/mod

      3)go get命令缓存下载的checksum数据到$GOPATH/pkg/sumdb目录

  

 

  开启 Go Modules mode

    Go 1.11起,可以显式启用 module模式(GO111MODULE=on)

go 命令允许在当前目录或任何父目录具有 go.mod 文件时使用模块模式,前提是该目录位于 $GOPATH/src 之外。($GOPATH/src 内部,为了兼容性,go 命令仍以旧的 GOPATH 模式运行,即使找到 go.mod 文件

    在 Go 1.13,无需显式设置启用模块模式,只需设置 GO111MODULE=auto,如果发现任何 go.mod,即使在 GOPATH 内部,也表示启用模块模式。
(在 Go 1.13 之前,GO111MODULE=auto 永远不会在 GOPATH 内启用模块模式)

    自 Go 1.14 以来,模块支持被视为可供生产环境使用,鼓励所有用户从其他依赖管理系统迁移到 Module。并且改回需显式设置启用模块模式
(通过设置 GO111MODULE=on),如果不存在 go.mod 文件,大多数模块命令的功能更有限

      1)go env  查看环境变量配置

Go Modules第1张Go Modules第2张
(base) ➜  go_study git:(master) ✗ go env                             
GO111MODULE=""
GOARCH="amd64"
GOBIN="/Users/yangyongjie/dev/GoHomePath/bin"
GOCACHE="/Users/yangyongjie/Library/Caches/go-build"
GOENV="/Users/yangyongjie/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/yangyongjie/dev/GoHomePath/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/yangyongjie/dev/GoHomePath"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.16.3"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/yangyongjie/GoProjects/my/go_study/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/m5/5hxf5c2n1h12s87w952hhjbc0000gn/T/go-build1899619172=/tmp/go-build -gno-record-gcc-switches -fno-common"
View Code

      2)若没有开启,修改 GO111MODULE 环境变量的值,开启 go module

go env -w GO111MODULE=on

    Golang 1.16 中Module的一些变化

      1)默认开启 Modules

      2)不自动修改 go.mod 和 go.sum

      3)通过指定 @version 后缀安装特定版本可执行文件

      4)新增 retract 指令撤回 Module 版本

      5)使用新增配置变量 GOVCS 指定特定模块使用特定版本控制工具

        

  go mod 命令

命令作用
go mod init生成 go.mod 文件
go mod download下载 go.mod 文件中指明的所有依赖
go mod tidy整理现有的依赖
go mod graph查看现有的依赖结构
go mod edit编辑 go.mod 文件
go mod vendor导出项目所有的依赖到 vendor 目录
go mod verify校验一个模块是否被篡改过
go mod why查看为什么需要依赖某模块

  GOPROXY

    这个环境变量主要是用于设置 Go 模块代理(Go module proxy),其作用是用于使 Go 在后续拉取模块版本时能够脱离传统的 VCS 方式,直接通过镜像站点来快速拉取

    GOPROXY 的默认值是:https://proxy.golang.org,direct,这有一个很严重的问题,就是 proxy.golang.org 在国内是无法访问的,因此这会直接卡住你的第一步,所以你必须在开启 Go modules 的时,同时设置国内的 Go 模块代理,执行如下命令:

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

    GoLand配置GOPROXY:

Go Modules第3张

  初始化项目 

    进入项目文件夹,执行 go mod init 命令,根据我们的项目创建一个 Go Module

go mod init project_name
如:
    go mod init go_study
    go: creating new go.mod: module go_study
    go: to add module requirements and sums:
        go mod tidy

    执行命令之后,会在项目根目录下生成go.mod文件,里面包含了所有的三方包,内容如:

module go_study

go 1.16

require (
    github.com/gin-gonic/gin v1.7.7
    github.com/go-redis/redis/v8 v8.11.4
    github.com/gomodule/redigo v1.8.6
)    

    说明:

      module:用于定义当前项目的模块路径

      go:用于标识当前模块的Go语言版本,值为初始化模块时的版本,目前来看还只是个标识作用

      require:用于设置一个特定的模块版本

      exclude:用于从使用中排除一个特定的模块版本

      replace:用于将一个模块版本替换为另外一个模块版本

go build 和 go install:

   区别:

    go build:编译包及其依赖项,但不安装包,在项目目录下生成可执行文件(有main包)

    go install:编译并安装包

      1)编译生成可执行文件(有main包),将可执行文件放到 bin 目录($GOPATH/bin)

      2)安装包文件(无main包),将编译后的包文件放到 pkg 目录下($GOPATH/pkg)。

     

    相同点:

      都会生成可执行文件

    不同点:

      go build不能生成包文件,go install可以生成包文件

      go build生成的可执行文件在当前目录下,go install生成的可执行文件在bin目录下($GOPATH/bin)

    1、go build

      在编译包时,会忽略以 '_test.go' 结尾的文件

      命令使用: go build [-o 输出目录] [build flags] [packages]

      -o 强制构建的可执行文件输出到指定的输出文件或目录

      build flags:

build flag作用
-a force rebuilding of packages that are already up-to-date
-nprint the commands but do not run them.
-p n

the number of programs, such as build commands or test binaries, that can be run in parallel.
The default is the number of CPUs available.

 -race

enable data race detection.
Supported only on linux/amd64, freebsd/amd64, darwin/amd64, windows/amd64, linux/ppc64le and linux/arm64 (only for 48-bit VMA).

 -mod mode

module download mode to use: readonly, vendor, or mod.
By default, if a vendor directory is present and the go version in go.mod
is 1.14 or higher, the go command acts as if -mod=vendor were set.
Otherwise, the go command acts as if -mod=readonly were set.
See https://golang.org/ref/mod#build-commands for details.

    2、go install

     go install注意:

      将 Go 安装目录添加到系统的 shell 路径,这样您将能够运行程序的可执行文件,而无需指定可执行文件的位置:

        On Linux or Mac, run the following command:export PATH=$PATH:/path/to/your/install/directory

        On Windows, run the following command:set PATH=%PATH%;C:\path\to\your\install\directory

      作为替代方案,如果你的 shell 路径中已经有一个像 $HOME/bin 这样的目录,并且你想在那里安装你的 Go 程序,你可以通过使用 go env 命令设置 GOBIN 变量来更改安装目标
        go env -w GOBIN=/path/to/your/bin
      or
        go env -w GOBIN=C:\path\to\your\bin     
      
      然后就可以执行 go install命令编译并安装包文件了

  

END.

免责声明:文章转载自《Go Modules》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇分区函数Partition By的用法(转载)dockerfile构建的镜像中文乱码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SVN常见问题汇总

1、’.’ is not a working copy.Can’t open file‘.svn/entries’: 系统找不到指定的路径。 解答:原因是输入的访问路径不正确,如svn://192.168.6.200/如果最后少写了“/”,就会出现这种错误提示。2、将文件checkout之后,没有出现SVN的图标,是怎么回事?解答:有些时候在客户端Che...

CentOS安装

目前,我们安装Linux操作系统的主要目的是为了更好地了解和学习它。如果条件允许,最好把Linux操作系统安装在一台PC机上;如果条件不允许也没有关系,阿铭会教你使用虚拟机来安装Linux操作系统。 大多数读者朋友比较习惯使用Windows操作系统,所以建议你使用虚拟机来学习Linux。阿铭相信,如果在Windows系统里安装一个虚拟机,然后在虚拟机上安装...

protobuf编译

win10   cmake   vs2017编译 protobuf编译 cmake Selecting Windows SDK version 10.0.17134.0 to target Windows 10.0.19042. The C compiler identification is MSVC 19.15.26732.1 The CXX com...

Java路径问题解决方案收集

Java路径中的空格问题 1, TestURL().class.getResource("").getPath()或TestURL().class.getResource("").getFile()获得的路径,不能被FileReader()和FileWriter()直接应用。   原因是URL对空格,特殊字符(%,#,[]等)和中文进行了编码处理。   例...

postgres备份恢复相关

25.3.连续归档和时间点恢复(PITR) 摘自http://www.postgres.cn/docs/11/continuous-archiving.html 第一步建立wal归档 wal_level配置成replica或更高 archive_mode为on 配置archive_command,在archive_command中,%p会被将要归档的文件路...

Skimap_ros 利用RGBD创建Octomap(一)

1. 奥比中光astra RGBD相机安装 1.1 安装依赖 $ sudo apt-get install build-essential freeglut3 freeglut3-dev 1.2 检查udev版本,需要libudev.so.1,如果没有则添加 #check udev version, Orbbec Driver need libudev...