go module_go module 编译 - CSDN
精华内容
参与话题
  • go module的使用

    千次阅读 2019-06-28 19:07:44
    文章目录一、Window下go语言的安装二、安装go的一些工具三、go module 的使用 一、Window下go语言的安装 其中,go版本更新通过删除原来的版本然后重新安装即可 官网下载 下载地址 安装 直接安装即可 环境变量配置 ...

    一、Window下go语言的安装

    其中,go版本更新通过删除原来的版本然后重新安装即可

    1. 官网下载
      下载地址
    2. 安装
      直接安装即可
    3. 环境变量配置
      我的电脑右键可以设置(安装过程中应该有选项可以设置的)

    二、安装go的一些工具

    1. 新建文件夹

      mkdir $GOPATH/src/golang.org/x/
      
    2. 下载包

      go get github.com/golang/net/context
      

      此时你会看到报错:

      package github.com/golang/net/context:
         code in directory /go/src/github.com/golang/net/context
         expects import "golang.org/x/net/context"
      

      不用管,直接下一步

    3. 复制内容

      cp $GOPATH/src/github.com/golang/tools $GOPATH/src/golang.org/x/ -rf
      
    4. 安装工具包

      $ go install golang.org/x/tools/go/buildutil
      
    5. 打开 vscode ,然后根据提示安装

    6. 如果出现下载不了的包,在 github 上的镜像 里面寻找需要的包,复制链接,在命令行内进入 $GOPATH/src/golang.org/x/目录,输入下面指令

      git clone [链接] [包名]
      
    7. 与上面类似复制内容

    8. 进入 vscode ,根据提示安装即可

    三、go module 的使用

    1. 对于 go 版本是1.11的,在非GOPATH目录里,需要开启 GO11MODULE=on
    2. 对于 go 版本是1.12的,在非GOPATH目录里,GO11MODULE是默认开启的,但是如果一开始在GOPATH目录里,也可以开启
    3. 对于windows用户,用powershell开启方式
      $Env:GO111MODULE="on"
      
    4. 初始化
      go mod init 模块名称
      
    5. 下载内容
      1. 对于一般的,直接用
        go mod download
        
      2. 对于和前面一样下不了的,可以通过代替
        形如:
        replace (
        golang.org/x/crypto => github.com/golang/crypto latest
        golang.org/x/sys => github.com/golang/sys latest
        )
        
      3. 也可以使用GOPROXY的方式
        1. goproxy是一个开源代理服务器,可以让我们控制自己从哪里去下载源代码,如果 GOPROXY 没有设置,go 会直接从代码库下载相关依赖代码。
        2. 因此可以通过下面的方式设置代理
          export GOPROXY=https://goproxy.io
          
    6. 存放位置
      go.mod下载下来的内容存放在$GOPATH/pkg/mod/目录下
    展开全文
  • Golang Module的使用

    千次阅读 2019-09-07 14:34:38
    前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具。开发者通常会使用vendor或者glide的方式来管理依赖(也有直接...在Golang1.11版本中需要使用export GO111MODULE=on来显式开启go moduleGolang1.1...

    前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具。开发者通常会使用vendor或者glide的方式来管理依赖(也有直接使用GOPATH多环境方式),而在Golang1.11之后官方终于出了名为go modules的版本管理机制。

    注意:

    • 在Golang1.11版本中需要使用export GO111MODULE=on来显式开启go module
    • 在Golang1.12之后默认开启了module

    Golang Module快速入门

    初始化项目

    # 在GOPATH之外创建一个项目目录
    ➜  mkdir cmdb-job
    
    # 进入目录后初始化一个module
    ➜  cd cmdb-job
    ➜  go mod init cmdb-job
    go: creating new go.mod: module cmdb-job
    
    # 查看生成的mod.md
    ➜  cat go.mod
    module cmdb-job
    
    go 1.12
    
    # 使用第三方模块编写一丢丢代码逻辑
    # 一个字符串简单几种加密方式的简单工具
    ➜ cat main.go
    /*================================================================
    *Copyright (C) 2019 BGBiao Ltd. All rights reserved.
    *
    *FileName:main.go
    *Author:BGBiao
    *Date:2019年09月07日
    *Description:
    *
    ================================================================*/
    package main
    import (
        "fmt"
        "github.com/xxbandy/go-utils/crypto"
    )
    
    func main() {
        fmt.Println(crypto.Md5("hello"))
        fmt.Println(crypto.Hmac("key2", "hello"))
        fmt.Println(crypto.Sha1("hello"))
        fmt.Println(crypto.HmacSha1("key2", "hello"))
    }
    
    # 查看下项目结构和依赖
    ➜ tree -L 1 .
    .
    ├── go.mod
    ├── go.sum
    └── main.go

    测试运行项目

    # 测试运行
    # 第一次运行会自动检查代码里的第三方依赖包,并下载和接下项目依赖的包
    ➜  go run main.go
    go: finding github.com/xxbandy/go-utils/crypto latest
    go: finding github.com/xxbandy/go-utils latest
    go: downloading github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2
    go: extracting github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2
    5d41402abc4b2a76b9719d911017c592
    f1b90b4efd0e5c7db52dfa0efd6521a3
    aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
    79806c50bab4825a371e3c4fff80bae0c731d54e
    
    # 第二次运行
    ➜  go run main.go
    5d41402abc4b2a76b9719d911017c592
    f1b90b4efd0e5c7db52dfa0efd6521a3
    aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
    79806c50bab4825a371e3c4fff80bae0c731d54e
    
    # 查看管理mod的依赖配置
    ## go.mod会记录项目所需依赖以及具体的版本号记录(go-utils这个库没有版本,所以会根据提交日期和commitid来唯一标识版本)
    ➜  cat go.mod
    module cmdb-job
    
    go 1.12
    
    require github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2 // indirect
    
    ## go.sum文件会记录依赖树的详细信息
    ➜  cat go.sum
    github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2 h1:SD6OuR8EUvCmiBDoxItcFYXIMuse45HvuSh3ho0AAeU=
    github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2/go.mod h1:XhyyBI KH4XEIbw3EhMFjZfJcV3kDK4iSAT7zZYd Uc=
    

    Go Module的其他功能

    注意:go mod 还有一些其他比较有意思的工具,比如可以打印依赖树,比如可以查看哪些模块在哪些包引用了

    go mod的其他特性

    # 执行go help mod可以查看到以下子命令
    ➜ go help mod
        download    download modules to local cache       # 下载模块包到本地缓存
        edit        edit go.mod from tools or scripts     # 从工具或脚本中修改go.md内容(暂时没觉得很好用)
        graph       print module requirement graph        # 打印模块依赖树
        init        initialize new module in current directory # 在当前目录初始化一个模块
        tidy        add missing and remove unused modules      # 添加或略或删除不使用的包
        vendor      make vendored copy of dependencies         # 将依赖拷贝到vendor中(会将依赖打包到当前目录下的vendor目录)
        verify      verify dependencies have expected content  # 检查依赖内容
        why         explain why packages or modules are needed # 解释为什么哪些包或者模块被需要
    
    
    # 查看当前项目的依赖树(项目复杂时比较有用)
    ➜  go mod graph
    cmdb-job github.com/xxbandy/go-utils@v0.0.0-20190506113112-d88d469a26b2
    # 查看模块或包在哪里被依赖了
    ➜  go mod why github.com/xxbandy/go-utils/crypto
    # github.com/xxbandy/go-utils/crypto
    cmdb-job
    github.com/xxbandy/go-utils/crypto
    
    # 拷贝一份依赖到项目本地
    # 会将项目的依赖包拷贝到项目的vendor目录中
    ➜  go mod vendor
    ➜  tree -L 3 .
    .
    ├── go.mod
    ├── go.sum
    ├── main.go
    └── vendor
        ├── github.com
        │   └── xxbandy
        └── modules.txt

    注意:这个时候可能会有人有疑问了,既然go mod vendor将依赖拷贝一份到项目家目录的vendor目录了,那原始的依赖存在哪里?比如我们之前没有依赖管理之前,默认的依赖都是在$GOPATH/src/下面的

    其实,在使用了go mod之后,项目依赖的全部依赖包都会在$GOPATH/pkg/mod/cache/download/中统一缓存下来,而项目中的go.md中会记录真正的版本信息,去缓存中引用即可。

    # 查看go mod之后缓存的依赖包
    ➜  tree -L 3   ${GOPATH}/pkg/mod/cache/download/
    ${GOPATH}/pkg/mod/cache/download/
    └── github.com
        └── xxbandy
            └── go-utils
    

    一个开源项目示例

    我们就以golang-gin-vue项目为例来看下go mod的一些功能吧.

    golang-gin-vue是一个使用gin框架编写后端接口,结合vue来渲染前端的一个示例项目.

    # 克隆项目到本地
    ➜ git clone https://github.com/xxbandy/golang-gin-vue.git
    
    ➜  cd golang-gin-vue
    
    # 使用go mod初始化项目
    ➜  golang-gin-vue git:(master) go mod init golang-gin-vue
    go: creating new go.mod: module golang-gin-vue
    
    # 初始化后会默认生成go.mod文件,但是不会加载依赖包,需要go run或者go build来自动加载依赖
    ➜  golang-gin-vue git:(master) ✗ go build main.go
    go: finding github.com/gorilla/mux v1.7.3
    go: downloading github.com/gorilla/mux v1.7.3
    go: extracting github.com/gorilla/mux v1.7.3
    
    # 查看go.mod文件
    ➜  golang-gin-vue git:(master) ✗ cat go.mod
    module golang-gin-vue
    go 1.12
    require (
        github.com/gin-gonic/gin v1.4.0 // indirect
        github.com/gorilla/mux v1.7.3 // indirect
    )
    
    # 打印依赖树关系
    ## 基本上可以知道项目和库依赖了哪些库
    ➜  go mod graph
    golang-gin-vue github.com/gin-gonic/gin@v1.4.0
    golang-gin-vue github.com/gorilla/mux@v1.7.3
    github.com/gin-gonic/gin@v1.4.0 github.com/gin-contrib/sse@v0.0.0-20190301062529-5545eab6dad3
    github.com/gin-gonic/gin@v1.4.0 github.com/golang/protobuf@v1.3.1
    github.com/gin-gonic/gin@v1.4.0 github.com/json-iterator/go@v1.1.6
    github.com/gin-gonic/gin@v1.4.0 github.com/mattn/go-isatty@v0.0.7
    github.com/gin-gonic/gin@v1.4.0 github.com/modern-go/concurrent@v0.0.0-20180306012644-bacd9c7ef1dd
    github.com/gin-gonic/gin@v1.4.0 github.com/modern-go/reflect2@v1.0.1
    github.com/gin-gonic/gin@v1.4.0 github.com/stretchr/testify@v1.3.0
    github.com/gin-gonic/gin@v1.4.0 github.com/ugorji/go@v1.1.4
    github.com/gin-gonic/gin@v1.4.0 golang.org/x/net@v0.0.0-20190503192946-f4e77d36d62c
    github.com/gin-gonic/gin@v1.4.0 gopkg.in/go-playground/assert.v1@v1.2.1
    github.com/gin-gonic/gin@v1.4.0 gopkg.in/go-playground/validator.v8@v8.18.2
    github.com/gin-gonic/gin@v1.4.0 gopkg.in/yaml.v2@v2.2.2
    github.com/stretchr/testify@v1.3.0 github.com/davecgh/go-spew@v1.1.0
    github.com/stretchr/testify@v1.3.0 github.com/pmezard/go-difflib@v1.0.0
    github.com/stretchr/testify@v1.3.0 github.com/stretchr/objx@v0.1.0
    github.com/mattn/go-isatty@v0.0.7 golang.org/x/sys@v0.0.0-20190222072716-a9d3bda3a223
    gopkg.in/yaml.v2@v2.2.2 gopkg.in/check.v1@v0.0.0-20161208181325-20d25e280405
    golang.org/x/net@v0.0.0-20190503192946-f4e77d36d62c golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2
    golang.org/x/net@v0.0.0-20190503192946-f4e77d36d62c golang.org/x/text@v0.3.0
    golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/sys@v0.0.0-20190215142949-d0b11bdaac8a
    
    # 查看gin这个模块被哪里需要(golang-gin-vue项目和gin框架本身需要)
    ➜ go mod why github.com/gin-gonic/gin
    # github.com/gin-gonic/gin
    golang-gin-vue
    github.com/gin-gonic/gin
    

    Tips

    我们在使用Golang进行开发过程中,通常会发现各种第三方库会依赖golang.org/x之类的原生库,或者一些其他国外大厂提供的共有库,由于政策原因,我们是无法直接访问国外网站来下载依赖库的(网速也有限制),因此在开发过程中也是比较头疼的. 这个时候通常大家都会去采用科学上网,或者通过一些代理的方式来解决. 而在Golang高版本中,包含了goproxy特性,用户可以直接指定代理来下载依赖的第三方库,一方面解决了下载速度的问题,另外一方面也解决了无法访问的第三方库的下载。

    注意:goproxy必须在go1.11以上版本,并且开启了go module机制后才能使用的(因为我当前的环境都是1.12,大家可以验证下小版本是否支持)

    而在国内,质量比较好的几个goproxy代理大概有如下几个:

    • https://goproxy.cn : 七牛云赞助支持的开源代理
    • https://mirrors.aliyun.com/goproxy/ : 阿里云官方维护的go代理
    • https://goproxy.io/ : 也是一个开源的go代理

    go代理使用

    # 开启go module支持
    # golang1.11 需要手动开启,golang1.12之后默认会开启
    $ export GO111MODULE=on
    
    # 设置代理(上述三个代理地址都可以)
    $ export GOPROXY=https://goproxy.cn
    
    # 下载第三方库
    
    $ go get -v golang.org/x/net/websocket
    Fetching https://goproxy.cn/golang.org/x/net/websocket/@v/list
    Fetching https://goproxy.cn/golang.org/x/net/@v/list
    go: finding golang.org/x/net latest
    Fetching https://goproxy.cn/golang.org/x/net/@latest
    Fetching https://goproxy.cn/golang.org/x/net/@v/v0.0.0-20190827160401-ba9fcec4b297.mod
    golang.org/x/net/websocket
    
    

    自从使用了goproxy之后,妈妈再也不用担心无法下载第三方库拉,爽到不行.欢迎关注我的公众号Wechat.jpeg

    展开全文
  • 以前写过一篇关于go管理依赖包工具 dep的文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是“official experiment”官方实验项目的那样,随着go modules 在go1.11版...

    以前写过一篇关于go管理依赖包工具 dep的文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是“official experiment”官方实验项目的那样,随着go modules 在go1.11版推出,go1.12版功能不断改进,再到go1.13版完善优化,正式扶正。预计dep将来也只能定格在“official experiment”了。

    Go Modules有哪些特点:

    • Go Modules是官方正式推出的包依赖管理项目,由Russ Cox (即Go 现在的掌舵人)推动,dep是“official experiment”仅此而已。

    • Go modules 出现的目的之一就是为了解决 GOPATH 的问题,也就相当于是抛弃 GOPATH 了。以前项目必须在$GOPATH/src 里进行,现在Go 允许在$GOPATH/src外的任何目录下使用 go.mod 创建项目。当然现在

    • 随着模块一起推出的还有模块代理协议(Module proxy protocol),通过这个协议我们可以实现 Go 模块代理(Go module proxy),也就是依赖镜像。

    • Tag必须遵循语义化版本控制,如果没有将忽略 Tag,然后根据你的 Commit 时间和哈希值再为你生成一个假定的符合语义化版本控制的版本号。

    • Go modules 还默认认为,只要你的主版本号不变,那这个模块版本肯定就不包含 Breaking changes,因为语义化版本控制就是这么规定的啊。

    • Global Caching 这个主要是针对 Go modules 的全局缓存数据说明,如下:

      • 同一个模块版本的数据只缓存一份,所有其他模块共享使用。
      • 目前所有模块版本数据均缓存在 $GOPATH/pkg/mod$GOPATH/pkg/sum 下,未来或将移至 $GOCACHE/mod$GOCACHE/sum 下( 可能会在当 $GOPATH 被淘汰后)。
      • 可以使用 go clean -modcache 清理所有已缓存的模块版本数据。

      另外在 Go1.11 之后 GOCACHE 已经不允许设置为 off 了,我想着这也是为了模块数据缓存移动位置做准备,因此大家应该尽快做好适配。

    如果你的版本是go1.12或更早版本,这里建议升级到go1.13,来体验一把go modules,看它能给你带来哪些方面身心的愉悦。

    本文将介绍使用Go Modules相关操作

    1、安装Go 1.13或升级到Go 1.13

    安装

    2、配置环境变量

    #修改 GOBIN 路径(可选)
    go env -w GOBIN=$HOME/bin
    #打开 Go modules
    go env -w GO111MODULE=on
    #设置 GOPROXY
    go env -w GOPROXY=https://goproxy.cn,direct
    

    go env -w: Go1.13 新增了 go env -w 用于写入环境变量,而写入的地方是 os.UserConfigDir 所返回的路径,需要注意的是 go env -w 不会覆写。需要指出,它不会覆盖系统环境变量。

    GO111MODULE:

    这个环境变量主要是 Go modules 的开关,主要有以下参数:

    • auto:只在项目包含了 go.mod 文件时启用 Go modules,在 Go 1.13 中仍然是默认值,详见
      :golang.org/issue/31857。
    • on:无脑启用 Go modules,推荐设置,未来版本中的默认值,让 GOPATH 从此成为历史。
    • off:禁用 Go modules。

    GOPROXY:

    这个环境变量主要是用于设置 Go 模块代理,它的值是一个以英文逗号 “,” 分割的 Go module proxy 列表,默认是proxy.golang.org,国内访问不了。这里要感谢盛傲飞和七牛云为中国乃至全世界的 Go 语言开发者提供免费、可靠的、持续在线的且经过CDN加速Go module proxy(goproxy.cn)。

    其实值列表中的 “direct” 为特殊指示符,用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等),当值列表中上一个 Go module proxy 返回 404 或 410 错误时,Go 自动尝试列表中的下一个,遇见 “direct” 时回源,遇见 EOF 时终止并抛出类似 “invalid version: unknown revision…” 的错误。

    3、创建你的项目

    这里我们在$GOPATH/src外,创建 /var/www/demo实例

    mkdir /var/www/demo
    cd  /var/www/demo
    

    新建main.go

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"fmt"
    )
    
    func main() {
    	r := gin.Default()
    	r.GET("/ping", func(c *gin.Context) {
    		fmt.Println("hello world!")
    		c.JSON(200, gin.H{
    			"message": "pong",
    		})
    	})
    	r.Run() // listen and serve on 0.0.0.0:8080
    }
    

    4、在/var/www/demo根目录下

    #生成go.mod文件
    go mod init  demo
    

    打开go.mod文件,内容

    module demo
    
    go 1.13
    

    go.mod 是启用了 Go moduels 的项目所必须的最重要的文件,它描述了当前项目(也就是当前模块)的元信息,每一行都以一个动词开头,目前有以下 5 个动词:

    • module:用于定义当前项目的模块路径。
    • go:用于设置预期的 Go 版本。
    • require:用于设置一个特定的模块版本。
    • exclude:用于从使用中排除一个特定的模块版本。
    • replace:用于将一个模块版本替换为另外一个模块版本。

    这里的填写格式基本为包引用路径+版本号,另外比较特殊的是 go $version,目前从 Go1.13 的代码里来看,还只是个标识作用,暂时未知未来是否有更大的作用。

    5、在/var/www/demo根目录下,执行 go build

    go build
    

    完成后项目

    ├── demo
    ├── go.mod
    ├── go.sum
    └── main.go
    

    项目中增加了go.sum、demo文件

    go.sum文件内容

    github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
    github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g=
    github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod 
    github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ=
    github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
    ...
    
    

    go.sum类似于比如 dep 的 Gopkg.lock 的一类文件,它详细罗列了当前项目直接或间接依赖的所有模块版本,并写明了那些模块版本的 SHA-256 哈希值以备 Go在今后的操作中保证项目所依赖的那些模块版本不会被篡改。

    我们可以看到一个模块路径可能有如下两种:

    github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ=
    github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
    

    前者为 Go modules 打包整个模块包文件 zip 后再进行 hash 值,而后者为针对 go.mod 的 hash 值。他们两者,要不就是同时存在,要不就是只存在 go.mod hash。

    那什么情况下会不存在 zip hash 呢,就是当 Go 认为肯定用不到某个模块版本的时候就会省略它的 zip hash,就会出现不存在 zip hash,只存在 go.mod hash 的情况。

    go.mod文件内容发生了变化,增加了

    require github.com/gin-gonic/gin v1.4.0
    

    默认使用最新版本的package。

    更换依赖版本

    查看gin所有历史版本

    go list -m -versions github.com/gin-gonic/gin
    

    github.com/gin-gonic/gin v1.1.1 v1.1.2 v1.1.3 v1.1.4 v1.3.0 v1.4.0

    如果想更换依赖版本,比如v1.3.0,怎么办?

    只需执行如下命令

    go mod edit -require="github.com/gin-gonic/gin@v1.3.0"
    go mod  tidy #更新现有依赖
    

    @后跟版本号,这个时候go.mod已经修改好了

    require github.com/gin-gonic/gin v1.3.0
    

    查看所有项目依赖的包

    go list -m all
    
    github.com/davecgh/go-spew v1.1.0
    github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3
    github.com/gin-gonic/gin v1.4.0
    github.com/golang/protobuf v1.3.1
    github.com/json-iterator/go v1.1.6
    github.com/mattn/go-isatty v0.0.7
    github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
    github.com/modern-go/reflect2 v1.0.1
    github.com/pmezard/go-difflib v1.0.0
    github.com/stretchr/objx v0.1.0
    github.com/stretchr/testify v1.3.0
    github.com/ugorji/go v1.1.4
    golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
    golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c
    golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223
    golang.org/x/text v0.3.0
    gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
    gopkg.in/go-playground/assert.v1 v1.2.1
    gopkg.in/go-playground/validator.v8 v8.18.2
    gopkg.in/yaml.v2 v2.2.2
    

    快速迁移项目至 Go Modules

    1. 在你项目的根目录下执行 go mod init 项目名 (项目名可不加),以生成 go.mod 文件。
    2. 执行 go mod tidy` 更新整理现有的依赖,删除未使用的依赖。

    注意

    使用go.mod管理依赖会对go get命令产生一定影响,

    • go help module-getgo help gopath-get分别去了解 Go modules 启用和未启用两种状态下的 go get 的行为

    • go get 拉取新的依赖

      • 拉取最新的版本(优先择取 tag):go get golang.org/x/text@latest

      • 拉取 master 分支的最新 commit:go get golang.org/x/text@master

      • 拉取 tag 为 v0.3.2 的 commit:go get golang.org/x/text@v0.3.2

      • 拉取 hash 为 342b231 的 commit,最终会被转换为 v0.3.2:go get golang.org/x/text@342b2e

      • go get -u 更新现有的依赖

    go mod 相关命令

    go mod download 下载 go.mod 文件中指明的所有依赖

    go mod tidy 整理现有的依赖,删除未使用的依赖。

    go mod graph 查看现有的依赖结构

    go mod init 生成 go.mod 文件 (Go 1.13 中唯一一个可以生成 go.mod 文件的子命令)

    go mod edit 编辑 go.mod 文件

    go mod vendor 导出现有的所有依赖 (事实上 Go modules 正在淡化 Vendor 的概念)

    go mod verify 校验一个模块是否被篡改过

    go clean -modcache 清理所有已缓存的模块版本数据。

    go mod 查看所有 go mod的使用命令。

    参考资料:

    https://segmentfault.com/a/1190000020522261

    https://learnku.com/articles/27401

    links

    展开全文
  • go module

    2020-10-16 06:30:27
    go modulego官方自带的go依赖管理库,在1.13版本正式推荐使用 go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等 使用go module之后我们可不用将代码放置在src下了 使用 ...

    概述

    • go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用
      go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等
    • 使用go module之后我们可不用将代码放置在src下了
    • 使用 go module 管理依赖后会在项目根目录下生成两个文件 go.mod 和 go.sum。
    • go.mod 中会记录当前项目的所依赖,文件格式如下所示:
    module github.com/gosoon/audit-webhook
    go 1.12
    require (
        github.com/elastic/go-elasticsearch v0.0.0
        github.com/gorilla/mux v1.7.2
        github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81
    )

    go.sum记录每个依赖库的版本和哈希值,文件格式如下所示:

    github.com/elastic/go-elasticsearch v0.0.0 h1:Pd5fqOuBxKxv83b0+xOAJDAkziWYwFinWnBO0y+TZaA=
    github.com/elastic/go-elasticsearch v0.0.0/go.mod h1:TkBSJBuTyFdBnrNqoPc54FN0vKf5c04IdM4zuStJ7xg=
    github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
    github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
    github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81 h1:JP0LU0ajeawW2xySrbhDqtSUfVWohZ505Q4LXo+hCmg=
    github.com/gosoon/glog v0.0.0-20180521124921-a5fbfb162a81/go.mod h1:1e0N9vBl2wPF6qYa+JCRNIZnhxSkXkOJfD2iFw3eOfg=

    开启go module

    (1) go 版本 >= v1.11
    (2) 设置GO111MODULE环境变量
    要使用go module 首先要设置GO111MODULE=on,GO111MODULE 有三个值,off、on、auto,off 和 on 即关闭和开启,auto 则会根据当前目录下是否有 go.mod 文件来判断是否使用 modules 功能。无论使用哪种模式,module 功能默认不在 GOPATH 目录下查找依赖文件,所以使用 modules 功能时请设置好代理。
    在使用 go module 时,将 GO111MODULE 全局环境变量设置为 off,在需要使用的时候再开启,避免在已有项目中意外引入 go module。

    windows:
    set GO111MODULE=on
    mac:
    复制代码
    export GO111MODULE=on
    然后输入
    复制代码
    go env
    查看 GO111MODULE 选项为 on 代表修改成功

    GO PROXY

    • go module 的目的是依赖管理,所以使用 go module 时你可以舍弃 go get 命令(但是不是禁止使用, 如果要指定包的版本或更新包可使用go get,平时没有必要使用)
      因go的网络问题, 所以推荐使用 goproxy.cn 设置详见https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md
      初始化
    • 为你的项目第一次使用 GO MODULE(项目中还没有go.mod文件)
      进入你的项目文件夹
      cd xxx/xxx/test/
      初始化 MODULE
      go mod init test(test为项目名)
      我们会发现在项目根目录会出现一个 go.mod 文件
    • 注意,此时的 go.mod 文件只标识了项目名和go的版本,这是正常的,因为只是初始化了
      检测依赖
      go mod tidy
      tidy会检测该文件夹目录下所有引入的依赖,写入 go.mod 文件
      写入后你会发现 go.mod 文件有所变动
      例如:
    module test
    go 1.13
    require (
        github.com/gin-contrib/sessions v0.0.1
        github.com/gin-contrib/sse v0.1.0 // indirect
        github.com/gin-gonic/gin v1.4.0
        github.com/go-redis/redis v6.15.6+incompatible
        github.com/go-sql-driver/mysql v1.4.1
        github.com/golang/protobuf v1.3.2 // indirect
        github.com/jinzhu/gorm v1.9.11
        github.com/json-iterator/go v1.1.7 // indirect
        github.com/kr/pretty v0.1.0 // indirect
        github.com/mattn/go-isatty v0.0.10 // indirect
        github.com/sirupsen/logrus v1.2.0
        github.com/ugorji/go v1.1.7 // indirect
        golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae // indirect
        gopkg.in/yaml.v2 v2.2.4
    )

    此时依赖还是没有下载的

    • 下载依赖
      我们需要将依赖下载至本地,而不是使用 go get
      go mod download
      如果你没有设置 GOPROXY 为国内镜像,这步百分百会夯住到死
      此时会将依赖全部下载至 GOPATH 下,会在根目录下生成 go.sum 文件, 该文件是依赖的详细依赖, 但是我们开头说了,我们的项目是没有放到 GOPATH 下的,那么我们下载至 GOPATH 下是无用的,照样找不到这些包
      导入依赖
      go mod vendor
      执行此命令,会将刚才下载至 GOPATH 下的依赖转移至该项目根目录下的 vendor(自动新建) 文件夹下

    此时我们就可以使用这些依赖了

    GOLAND设置开启 GO MODULE

    可能是因为 GO MODULE 功能还需完善,GOLAND默认是关闭该功能的,我们需要手动打开(不排除之后更新会不会改成默认开启)

    依赖更新

    这里的更新不是指版本的更新,而是指引入新依赖
    依赖更新请从检测依赖部分一直执行即可,即
    go mod tidy
    go mod download
    go mod vendor

    新增依赖

    有同学会问,不使用 go get ,我怎么在项目中加新包呢?
    直接项目中 import 这个包,之后更新依赖即可

    在协作中使用 GOMODULE

    要注意的是, 在项目管理中,如使用git,请将 vendor 文件夹放入白名单,不然项目中带上包体积会很大
    git设置白名单方式为在git托管的项目根目录新建 .gitignore 文件
    设置忽略即可.
    但是 go.mod 和 go.sum 不要忽略
    另一人clone项目后在本地进行依赖更新(同上方依赖更新)即可

    GOMODULE常用命令

    go mod init # 初始化go.mod
    go mod tidy # 更新依赖文件
    go mod download # 下载依赖文件
    go mod vendor # 将依赖转移至本地的vendor文件
    go mod edit # 手动修改依赖文件
    go mod graph # 打印依赖图
    go mod verify # 校验依赖

    展开全文
  • Go Module已经来了,默认Go Module模式将会在1.13版本发布。也就是说半年后,就会全面铺开。鉴于官方提供扫盲文档中的样例过于简单,提供一个更加贴近实际开发过程的例子也许是有必要的。 官方文档参考:Go Module ...
  • 10分钟学会go module

    万次阅读 2019-07-01 20:16:45
    前两天参加了goperChina的大会收获颇多,go module算一个,下面把总结使用分享给大家,有问题希望指正。 基本使用 环境准备 golang 1.11的朋友,开启 GO11MODULE=on ,并且确保实验目录不在 GOPATH 中 golang 1.12...
  • Go module的介绍及使用

    万次阅读 多人点赞 2019-09-24 16:57:49
    Go1.1.1版本发布(2018-08-24发布)已经过去几天,从官方的博客中看到,有两个比较突出的特色,一个就是今天讲的module,模块概念。目前该功能还在试验阶段,有些地方还需要不断的进行完善。不过可以先尝尝鲜,感受下...
  • Golang1.12 包管理Go module使用

    万次阅读 2019-03-09 14:37:55
    Go Module简介初始化GoModule 简介 1.11版本初步引入的GoModule模块。1.12版本正式开始支持。GoModule是官方提供的包管理解决方案。通过GoModule,开发者可以把工程放在GOPATH之外的位置。相比于之前的包管理方案: ...
  • Go Module入门及Golang项目组织

    千次阅读 2020-03-31 09:40:11
    1.什么是Go Module? 简而言之,Go Modul是Go在1.12之后官方发布的包管理工具。 现代的语言都有很多好用的包管理工具,如 pip 之于 python,gem 之于 ruby,npm 之于 nodejs。然而 Golang 早期版本却没有官方的包管理...
  • go module管理依赖

    2019-12-23 22:52:26
    配置module环境 配置环境变量(1.13以后不需要设置) export GO111MODULE=on / auto # auto表示在gopath内则不使用mod 配置代理 export GOPROXY=https://gocenter.io export GOPROXY=https://goproxy.cn 新项目 #...
  • Golang中,有两个概念非常容易弄错,第一个就是GoPath,第二个则是GoModule,很多初学者不清楚这两者之间的关系,也就难以清晰地了解项目的整体结构,自然也就难以编写结构清晰的代码。 什么是GoPath? 什么是...
  • Golang依赖管理工具之go module(go1.11)

    万次阅读 2019-01-03 15:00:09
    可是,Go语言一直缺乏一个官方的包管理(Dep被称为官方试验品official experiment)。 终于,在go1.11 版本中,新增了module管理模块功能,用来管理依赖包。 要知道,在这个之前,想要对go语言包进行管理,只能依赖...
  • Go module机制

    千次阅读 2019-03-07 14:15:16
    Go module机制 从go1.11开始支持 可以不需要gopath存在 环境变量GO111MODULE,默认为auto 项目存在go.mod则使用go module,否则使用GOPATH和vendor机制 一、使用 1.新建项目名目录 mkdir mypro 2.使用go mod...
  • go-module迁移解决的问题: ...当前会话打开go-module:export GO111MODULE="on" 全局打开go-module用:go env -w GO111MODULE=on 初始化go.mod:go mod init [host/namespace/module-name] 比如:go m.
  • GO】17.Golang IDE下使用Go Module

    千次阅读 2019-06-25 14:40:04
    创建新项目并用Golang IDE打开 mac下 Golang -> Perferences -> Go -> Go Modules(vgo) -> Enable Go Modules (vgo) integration打勾 结构及代码: gosports/src/common/entity/test.go ...
  • Go Module 引入本地自定义包 Go Module 引入本地自定义包 参考URL: http://www.r9it.com/20190611/go-mod-use-dev-package.html Go Module 版本规则 go modules 是一个版本化依赖管理系统,版本需要遵循一些规则,...
  • 本月初Go1.13终于发布,go mod代码管理工具也正式转正。本篇也是记录Go1.13版本在Linux系统的环境搭建和使用go mod工具。 Linux发行版:CentOS7 64位 Go安装版本:go1.13.linux-amd64 目录 Go环境安装 使用go ...
  • go语言开启go-module

    2019-12-24 14:56:33
    本文作者:陈进坚 个人博客:https://jian1098.github.io CSDN博客:https://blog.csdn.net/c_jian ... 模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和...
  • go env GO111MODULE=on 使用go get下依赖可能会go env GOPROXY=下面代理的其中一个,我使用的是七牛云提供的,感谢七牛云 htps://goproxy.io https://goproxy.cn (七牛云) https://mirrors.aliyun.com/go…...
  • 如何使用Go Module代理

    千次阅读 2019-07-17 17:24:03
    在我们使用Go Module时,golang/org/x中的文件因为撞墙无法下载,通过改变GOPROXY环境变量可以指定下载源。 ·地址 https://mirrors.aliyun.com/goproxy/阿里云的代理仓 https://goproxy.io/ ·说明 阿里云的...
1 2 3 4 5 ... 20
收藏数 52,853
精华内容 21,141
关键字:

go module