📚
handbook
  • Introduction
  • 1.前言
    • 前言
    • 鸣谢
  • 2.环境篇
    • 工具部署和使用
      • 团队协作工具
        • Confluence
      • 开发工具
        • Docker
          • 镜像导入导出
          • 安装
        • Docker Compose
      • 持续集成工具
        • Gerrit
        • Sonarqube
          • 分析参数设定
          • Prerequisite
          • 服务端设置
        • Ubuntu Ci Deploy
          • ubuntu使用docker部署jenkins+sonarqube
        • 持续集成部署
      • 文本编辑工具
        • Gitbook相关注意事项
        • Markdown快速入门
      • 版本控制
        • Git
          • 1.基础
            • Git基础(一)
            • Git基础(二)
            • Git基础(三)
            • Git基础(四)
            • Git基础(五)
          • 2.命令详解
            • 命令速查
          • 3.进阶技巧
            • git技巧
      • 自动化测试工具
        • Appium
          • capability参数配置
          • 安装
          • 简介
      • 项目管理工具
        • Jira
    • 开发环境配置
      • 通用
        • Homebrew安装与使用
        • Git服务器添加SSH Key
        • koroFileHeader使用
        • nodejs与npm的安装
        • npm更换国内源
        • pip使用相关
        • PostgreSQL安装与使用
        • proxychain安装与使用
        • shell配置环境变量
        • snapd安装与使用
        • terminal走代理
    • 快捷键速查
      • shell常用快捷键
  • 3.语言篇
    • C
      • 代码规范
      • 语言技巧
    • Cpp
      • 代码规范
      • 基础知识
        • 理解C++中的左值和右值
      • 语言技巧
        • 并发编程
          • 简单的线程池实现
    • Golang
      • 代码规范
        • 避免使用转义字符串
        • 避免参数语义不明确
        • 嵌套式结构体
        • 函数的分组与顺序
        • 函数命名
        • 声明一致性
        • 导入别名
        • 使用字段名初始化结构体
        • 本地变量声明
        • map初始化
        • nil用法
        • 包命名
        • 命名Printf样式的函数
        • 减少嵌套
        • 缩小变量作用域
        • struct引用初始化
        • 测试表声明
        • 顶层变量声明
        • 不必要的else
      • 环境配置
        • 代码检查格式化工具
          • Go Fmt
          • Goimports
          • Golint
          • Go Vet
        • go mod详解
        • golang安装
        • Golang开发环境
        • Troubleshooting
      • 语言技巧
        • 如何分包
    • Java
      • 代码规范
      • 语言技巧
        • 注解编程
        • 动态代理
    • Js
      • 语言技巧
        • Rollup
    • Kotlin
      • 基础知识
        • 写给开发者Kotlin指引(一)
        • 写给开发者Kotlin指引(二)
    • Python
      • 语言技巧
        • Best Practice Of Python S Project Structure
  • 4.规范篇
    • Git message规范
  • 5.技术篇
    • Android技术
      • Hook
        • EdXposed例子
        • Android 10 上安装Magisk和EdXposed
      • Tinker
        • 1.Tinker及其使用
      • 准备
        • ADB连接设备步骤及注意事项
        • adb连接设备
        • aosp编译
      • 基础
        • Binder接口调用的鉴权方法
        • Make 及 Android 编译系统介绍
        • 使用Content Provider为其他应用提供数据
      • 源码阅读
        • Framework源码分析 Looper Handler
        • Framework源码分析 启动流程 ServiceManager的初始化
        • Framework源码分析 启动流程 Zygote启动SystemServer
    • JS Bridge
      • JSBridge初探
    • Kernel技术
      • kallsyms子系统
    • Test技术
      • 软件测试
        • jnekin+sonar 部署 问题总结
        • 性能测试基础
        • 软件测试的背景
        • 测试基础
        • 测试人员的核心竞争力
    • 操作系统原理
      • 处理器如何实现原子操作
Powered by GitBook
On this page
  • 一、go mod 是什么
  • 二、go mod 要解决什么问题
  • 三、go mod 使用
  • 3.1 在项目中使用
  • 3.2 添加本地依赖
  • 四、go mod 的问题
  • 4.1 环境变量 GO111MODULE
  • 4.2 go get 命令
  • 4.3 go install 命令
  • 五、总结

Was this helpful?

  1. 3.语言篇
  2. Golang
  3. 环境配置

go mod详解

一、go mod 是什么

go mod 是 go 1.11 引入的依赖管理工具,之前的 go 中有 package 的概念,go mod 则引入了 module 的概念。 比如在 engine/mai 目录下运行命令 go mod init silverbolt/mai,在 mai 目录下会生成一个 go.mod 文件, 文件第一行 module silverbolt/mai 就是说当前目录是一个名为 silverbolt/mai 的 module。

二、go mod 要解决什么问题

  1. go mod 可以用来管理 vendor 目录,替换 govendor 这个工具。

  2. 使用 go mod,可以在把 go 项目放在任意位置,而不再必须放在 GOPATH 中。

三、go mod 使用

3.1 在项目中使用

  1. 进入在任意位置的 go 项目,运行 go mod init [module_name] 命令生成 go.mod

  2. 运行 go mod tidy 命令添加缺失的 module,移除不再使用的 module

  3. 运行 go mod download 命令下载依赖 module 到本地 cache

  4. (可选)运行 go mod vendor 命令将依赖拷贝一份到当前 module 的 vendor 目录

注:使用 go module 之后,项目目录下的 vendor 目录可以要也可以不要。 go mod 的 cache 位于 $GOPATH/pkg/mod,没有 vendor 目录编译的时候会使用 cache 下面的依赖。

3.2 添加本地依赖

向 go.mod 中添加本地依赖:

require silverbolt/chin v0.0.0

replace silverbolt/chin v0.0.0 => ../chin

上面中的版本号不能省略,但可以随便写。

四、go mod 的问题

4.1 环境变量 GO111MODULE

使用 go mod 需要将 GO111MODULE 环境变量设为 on 或者 auto。 在 1.11 和 1.12 版本的 go 中,需要 export GO111MODULE=on, 在 1.13 版本的 go 中,GO111MODULE 被默认置为 auto。

GO111MODULE 为 on 和 off 可以理解为两种不同的模式,两种模式下,一些 go 的命令会有区别。

4.2 go get 命令

4.2.1 GO111MODULE=off 时

在 GO111MODULE=off 的情况下,go get 的功能就是一直使用的那样,下载并安装 package 到 $GOPATH/src 中。

4.2.2 GO111MODULE=on 时

在 GO111MODULE=on 的情况下:

  • 如果当前位于一个 module 中,go get 会下载 package 到 $GOPATH/pkg/mod 也就是 go mod 的 cache 中,

    同时会修改 go.mod,把 go get 的 package 添加到当前 module 的依赖中,不管当前 module 实际会不会依赖 go get 的 package。

比如这样:

require (
    github.com/tidwall/gjson v1.3.5 // indirect
    test_mai v0.0.0
)

这里测试 module 的空项目不依赖 gjson,只是在目录下运行了一句 go get,go.mod 中就多了上面这么一行。 当然,再运行一次 go mod tidy,这一行也就被移除了。

4.3 go install 命令

测试目录结构如下

test_go_module
├── go.mod
├── test_mai
│   ├── go.mod
│   ├── mai_pkg
│   │   └── mai_pkg.go
│   └── test_mai.go
└── test_nako
    ├── go.mod
    ├── go.sum
    └── main.go

4.3.1 GO111MODULE=off 时

使用 go install ./test_nako 命令可以编译出 test_nako,并安装可执行文件到 $GOPATH/bin。

4.3.2 GO111MODULE=on 时

如果 test_go_module 目录下没有 go.mod 文件,运行 go install ./test_nako 会提示 go: cannot find main module; see 'go help modules' 错误。

go mod init 命令在 test_go_module 目录下创建 go.mod 文件之后,运行 go install ./test_nako 会提示 go: directory test_nako is outside main module 错误。

只有实际进入 test_nako 目录之后,运行 go install . 目录,才会正确编译出可执行文件并安装到 $GOPATH/bin 目录。

也就是说 GO111MODULE=on 时,只有在 module 的目录下,才能对 module 运行 go install 的命令。

目前看到的 GO111MODULE 环境变量的影响就是这些,可能还会有其他的。

五、总结

go mod 确实要比 GOPATH 更加方便,但是 mod 的 cache 默认在 $GOPATH/pkg/mod 目录下, 为了让项目下载下来之后可以直接编译,项目中还是需要保留 vendor 目录。

如果只是把 go mod 作为 vendor 目录的管理工具引入 Silverbolt,只需要在各个子项目下生成 go.mod 进而生成 vendor 目录即可。

如果在编译时使用 GO111MODULE=on 的模式,源码就不需要在 GOPATH 中编译了,编译工具 terry 那边也需要做较大的修改: 包括为 terry 生成 go.mod、编译时不再拷贝源码、修改编译使用的 install 命令等。

PreviousGo VetNextgolang安装

Last updated 4 years ago

Was this helpful?

关于这一点,golang 的 issues 中的也有一些讨论:

链接