Go 语言编程 — go mod 依赖包管理

Wesley13 等级 427 0 0
标签:

目录

文章目录

  • 目录
  • go mod 依赖包管理
  • 使用 go mod

go mod 依赖包管理

go mod 是 Golang 1.11 版本引入的依赖包管理工具。其中,Golang 对 Modules 的定义:Modules 是相关 Go Packages 的集合,是源代码交换和版本控制的单元。

go 指令支持使用 Modules,包括记录和解析对其他模块的依赖性。Go Modules 替换旧的基于 GOPATH 的依赖管理方式,不再需要包含例如:src,bin 这样的子目录,一个源代码目录甚至是空目录都可以作为 Modules,只要其中包含了 go.mod 文件。

go.mod 文件一旦创建后,它的内容将会被 go toolchain 全面掌控。go toolchain 会在各类命令执行时,比如:go get、go build、go mod 等修改和维护 go.mod 文件。使用 go.mod 方式管理的依赖包都被下载到了 $GOPATH/pkg/mod 目录:

$ ll $GOPATH/pkg/mod/
total 0
drwxr-xr-x   3 mickeyfan  staff    96B  7 12 17:50 9fans.net
drwxr-xr-x   4 mickeyfan  staff   128B  7 12 18:05 cache
drwxr-xr-x  69 mickeyfan  staff   2.2K  7 12 18:12 github.com
dr-x------  16 mickeyfan  staff   512B  7 12 17:51 go.starlark.net@v0.0.0-20190702223751-32f345186213
drwxr-xr-x   3 mickeyfan  staff    96B  7 12 17:49 golang.org
drwxr-xr-x   6 mickeyfan  staff   192B  7 12 17:52 gopkg.in
drwxr-xr-x   3 mickeyfan  staff    96B  7 12 17:50 honnef.co
drwxr-xr-x   7 mickeyfan  staff   224B  7 12 17:52 mvdan.cc
drwxr-xr-x   3 mickeyfan  staff    96B  7 12 17:52 sourcegraph.com

除了 go.mod 之外,go 指令还维护了一个 go.sum 文件,其中包含特定模块版本内容的加密哈希。go 指令使用 go.sum 文件来确保这些模块的哈希值,以确保项目所依赖的模块不会出现意外更改。go.mod 和 go.sum 都应该应用于版本控制。 并且 go.sum 不需要手工维护,所以可以不用太关注。

使用 go mod

使用 Go Modules 需要配置 GO111MODULE 环境变量,GO111MODULE 有三个值:off、on 和 auto(默认值):

  • GO111MODULE=off:go 指令不支持 Modules 功能,寻找依赖包的方式依旧沿用旧版本那种通过 vendor 目录或者 GOPATH 环境变量来查找。
  • GO111MODULE=on:go 指令使用 Modules 方式,而不再到 GOPATH 目录下查找依赖包。
  • GO111MODULE=auto:go 指令根据当前目录来决定是否启用 Modules 功能。这种情况下可以分为两种情形:
    • 当项目处于 GOPATH/src 内,则会使用 GOPATH/src 的依赖包。
    • 当项目处于 GOPATH/src 外,则使用 go.mod 里 require 声明的包。

建议开启:

export GO111MODULE=on

使用 go.mod 的流程:

  1. 首先要在 GOPATH/src 目录之外新建 Golang 项目。

  2. 创建 main:

    package main

    import "fmt"

    func main() { fmt.Println("hello world!") }

  3. 初始化项目的 go.mod

    $ go mod init hello

    module hello

    go 1.14

注意,项目下属的子目录是不需要再次 init 的,所有子目录里的依赖都会组织在根目录的 go.mod 文件里。

  1. 导入外部包:

    package main

    import ( "fmt" "github.com/gohouse/gorose" )

    func main() { fmt.Println("hello world!") }

  2. 运行程序:

    $ go run hello.go go: finding module for package github.com/gohouse/gorose go: downloading github.com/gohouse/gorose v1.0.5 go: found github.com/gohouse/gorose in github.com/gohouse/gorose v1.0.5 go: finding module for package github.com/gohouse/converter go: downloading github.com/BurntSushi/toml v0.3.0 go: downloading github.com/gohouse/converter v0.0.3 go: found github.com/gohouse/converter in github.com/gohouse/converter v0.0.3 go: downloading github.com/go-sql-driver/mysql v1.4.0

    command-line-arguments

    ./hello.go:5:5: imported and not used: "github.com/gohouse/gorose"

  3. 检查 go.mod 自动依赖清单维护

    module hello

    go 1.14

    require ( github.com/gohouse/converter v0.0.3 // indirect github.com/gohouse/gorose v1.0.5 // indirect )

其中 require 是一个关键字,此外还有 module、replace 和 exclude:

  • module 语句:指定包的名字(路径)。
  • require 语句:指定的依赖项模块。
  • replace 语句:可以替换依赖项模块。
  • exclude语句:可以忽略依赖项模块。

另外,上述的 v0.0.3 就是依赖包 converter 的版本。如果没有在 go.mod 指定版本,go 指令就会自动下载代码中的依赖的最新版本。否则,go 指令会根据 require 语句的路径和版本进行下载。指定版本时也可以用 latest,表示下载最新的版本。

replace 语句常用于依赖包实际路径变更的场景中,例如:

replace golang.org/x/text => github.com/golang/text latest

如此的,在这种情况下依赖包的维护会变得更简单。

还需要注意 go.mod 中的 module hello 这一条语句,因为当前项目已经不在 GOPATH/src 内了,所以 module hello 标注了项目 “根” 的路径,以此来作为项目中其他包的根路径。

同时,go mod 指令也提供了以下子指令:
Go 语言编程 — go mod 依赖包管理

  • 初始化一个 moudle

    go mod init

  • 下载 modules 到本地 Cache

    go mod download

注:目前所有模块版本数据均缓存在 GOPATH/pkg/mod 和 GOPATH/pkg/sum 下。

  • 编辑 go.mod 文件,选项有 -json、-require 和 -exclude

    go mod edit

    e.g.

    go mod edit -replace=golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest

  • 以文本模式打印模块需求图

    go mod graph

  • 删除错误或者不使用的 modules

    go mod tidy

  • 生成 vendor 目录

    go mod vendor

  • 验证依赖是否正确

    go mod verify

  • 查找依赖

    go mod why

  • 清理 modules 缓存

    go clean -modcache

收藏
评论区

相关推荐

Go-连接Redis-学习go-redis包
Redis介绍 Redis是一个开源的内存数据结构存储,常用作数据库、缓存和消息代理。目前它支持的数据结构有诸如string、hash、list、set、zset、bitmap、hyperloglog、geospatial index和stream。Redis内置了复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过Redis Sentinel
go mod环境搭建
前言go mod 是golang最新的模块依赖管理的工具,推荐使用。 go 1.11通过设置环境变量GO111MODULE来决定是否启用 go1.13已经默认支持,以下以1.13为例配置环境变量 export GOPROXY 或 export GOPROXY export GOPATH"/Users/XXX
Linux环境部署go运行环境并启动项目
第一步、搭建Go生产环境1.下载包 https://golang.org/dl/2.解压(有1.14.4版本了,tar zxvf后回有个go文件夹) cd /usr/local/ wget https://dl.google.com/go/go1.13.6.linuxamd64.tar.gz tar xf go1.13.
go语言 init 函数的妙用
从程序逻辑结构角度来看,Go 包(package)是程序逻辑封装的基本单元,每个包都可以理解为一个”自治“的、封装良好的、对外部暴露有限接口的基本单元。一个 Go 程序就是由一组包组成的。在 Go 包这一基本单元中分布着常量、包级变量、函数、类型和类型方法、接口等,我们要保证包内部的这些元素在被使用之前处于合理有效的初始状态,尤其是包级变量。在 Go 语言中
Go 语言编程 — go mod 依赖包管理
目录 == ### 文章目录 * 目录 * go mod 依赖包管理 * 使用 go mod go mod 依赖包管理 ============ go mod 是 Golang 1.11 版本引入的依赖包管理工具。其中,Golang 对 Modules 的定义:Modules 是相关 Go Packages 的集合,是源代码交换和版本控制
gh
gh-ost实战运用 ========== 一、安装步骤 ------ **1、环境** go版本:1.10.3 gh-ost版本:1.0.46 **2、安装go语言** # 安装go依赖包 yum install bison ed gawk gcc libc6-dev make -y #
go mod 无法自动下载依赖包的问题
go 11以后启用了go mod功能,用于管理依赖包。 当执行`go mod init`生成`go.mod`文件之后,golang在`运行`、`编译`项目的时候,都会检查依赖并下载依赖包。 在启动了`go mod`之后,通过`go mod`下载的依赖包,不在放在`GOPATH/src`中,而是放到`GOPATH/pkg/mod`中。 比如我当前的`GO
go mod常用命令
开启Go module =========== go env ![](https://oscimg.oschina.net/oscnet/up-a2c46b6c3712f7a7e580445e593fe387a19.png) tips: 请使用go 1.13+版本 重点关注参数 ------ 开启go mod go en
go遇到的坑
******GO配置:****** ================= GOROOT:go的安装路径:C:\\Go GOPATH:go命令安装的包存放的路径,这里放在%GOROOT%\\gocode GOROOT是不用配置环境变量就可以用的,但是GOPATH要配置才能用,如果没有配置的话默认是在%{USER}%\\go文件夹下。 GOPATH可以配置
ACM团队周赛题解(2)
拉了CF583和CF486的两套div2题目 还是先贴宏定义部分 #define MAXN 1000000+5 #define MOD 1000000007 #define PI (acos(-1.0)) #define EPS 1e-6 #define MMT(s,a) memset(s, a, sizeof s) #define
VIM Go的IDE搭建图解
响应号召,咋们不翻墙 安装总体流程 ------ * go安装 * 查看vim是否支持python插件编写; * 下载vundle,管理vim的各种插件; * 配置.vimrc, 用于表现vim的功能行为,包括:颜色、字体、布局、IDE等 * 因为要安装go的IDE,没有翻墙,则需要github下载golang官方的tools包 *
GoLang 命令
\[TOC\] 查看可用命令 ====== 直接在终端中输入 go help 即可显示所有的 go 命令以及相应命令功能简介,主要有下面这些: * build: 编译包和依赖 * clean: 移除对象文件 * doc: 显示包或者符号的文档 * env: 打印go的环境信息 * bug: 启动错误报告 * fix: 运行go
Go包管理工具Module介绍
一、Go Modules ============ 1\. 介绍 ------ Go modules是官方提供的go包管理工具,用于解决go包管理和依赖问题;从Go1.11开始引入,到现在Go1.14已经比较完善,Go1.16已经全面推荐使用,并且默认为开启;Go Modules类似于JS的NPM,Java的maven和gradle。 * GO11
Go语言增强版操作Mysql(Sqlx)
点击上方“ **Go语言进阶学习** ”,进行关注 回复“**Go语言**”即可获赠从入门到进阶共10本电子书 今 日 鸡 汤 春城无处不飞花,寒食东风御柳斜。 前言 -- 上次咱们学习了如何使用Go操作Mysql,并且实现了简单的增删改查。 但是相对来说,还有有点复杂的,可能那些大佬也都觉得繁琐叭。 就又开发出了增强版查询Mysql操作