Go Modules

官方文档: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  查看环境变量配置

(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 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
-n print 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.

posted @ 2021-12-09 17:19  杨岂  阅读(270)  评论(0编辑  收藏  举报