go module 实践

什么是 go module

  • go module

    • go 的新依赖管理系统

    • Go 1.11 和 1.12 初步支持

      • $GOPATH

        外部

        • 前两者通过检测当前文件夹和父文件夹里的 go.mod
      • $GOPATH

        内部

        • 使用 GOPATH 模式,即使存在 go.mod 情况下
    • 1.13 默认使用

    • A collection of Go packages sotred in a file tree with a

      go.mod

      file at its root

      • Go 程序通过连接多个packages构成
      • package 由多个源代码文件构成,它们一起声明了常量、类型、变量、函数和它的外部可访问性
    • 只出现在 module 的根文件夹

      • 子文件夹下的 package = <modulel path> + <the subdirectory>
      • 子文件夹出现 go.mod 将视为独立的 module
    • 执行步骤

      • 解析版本

        @<version>
        • @latest

        • @none

        • @upgrade = -u

        • @patch = -u=patch

        • @v1

        • @v2

        • @<branch>

        • @<commit hash>

        • 冲突解决

          If thereare competing requirements for a particular module, then ‘go get’ resolvesthose requirements by taking the maximum requested version.

        • go list -m -versions 192.168.1.254/xx/xxx

        • go list -m -versions all

      • download if needed

      • build

      • install

    • go 命令会自动补全 go.mod 里缺失的 modules,默认使用 @latest 版本

    • go 命令同时维护着包含特殊 module 版本的密码学哈希的文件 go.sum

    • go.modgo.sum 应该被放到版本管理里

    • A semantic version has three parts: major, minor, and patch.

    • Each different major version (

      v1

      ,

      v2

      , and so on) of a Go module uses a different module path: starting at

      v2

      , the path must end in the major version.

      • If an old package and a new package have the same import path, the new package must be backwards compatible with the old package.
      • By definition, a new major version of a package is not backwards compatible with the previous version. This means a new major version of a module must have a different module path than the previous version.
go mod init example.com/hello # create a new module, initializing the go.mod file
go list -m all # 列出所有的 packages 和它们的子依赖

go list -m -versions rsc.io/sampler
rsc.io/sampler v1.0.0 v1.2.0 v1.2.1 v1.3.0 v1.3.1 v1.99.99

go get rsc.io/sampler@v1.3.1 # changes the required version of a dependency (or adds a new dependency)

go list -m -versions rsc.io/quote/v3
rsc.io/quote/v3 v3.0.0 v3.1.0

go mod tidy # remove unused dependencies

go package 相关问题

  • 相对导入

    go - relative import paths

    • An import path beginning with ./ or ../ is called a relative path.
    • First, a relative path can be used as a shorthand on the command line.
    • Second, if you are compiling a Go program not in a work space, you can use a relative path in an import statement in that program to refer to nearby code also not in a work space.
    • To avoid ambiguity, Go programs cannot use relative import paths within a work space.
  • Code in or below a directory named “internal“ is importable only by code in the directory tree rooted at the parent of “internal”.

  • vendor directories

    • Code in or below a directory named “internal“ is importable only by code in the directory tree rooted at the parent of “internal”.
  • Module proxy protocol

git仓库相关问题

  • git 支持哪些协议

    • local protocol
    • HTTP protocols
      • smart HTTP
      • dumb HTTP
    • SSH protocol
    • Git protocol
      • TCP port 9418
      • no authentication
      • latest version is v2
  • 如何使用 go get 下载 gitlab 私有项目

    • 内网Gitlab如何鉴权

      FAQ - Why does “go get” use HTTPS when cloning a repository - golang.org

      • 使用 SSH 私钥
        • git config --global --add url."git@192.168.1.254:".insteadOf "<http://192.168.1.254/>"
        • ~/.gitconfig
      • 使用密码或 token (Github, Gitlab)
        • ~/.netrc
    • 如何访问 HTTP 而不是 HTTPS

      • go get -insecure 192.168.1.254/xxx/xxxx
      • go env -w 'GOINSECURE=*.example.com,*.example2.com'

GOPROXY

  • GOPROXY.IO - 一个全球代理 为 Go 模块而生
    • GO111MODULE
    • GOPROXY
    • GOPRIVATE: a default value for GONOPROXY and GONOSUMDB.

GOSUMDB

常见 Go 代码托管仓库

使用问题

go get -insecure xxx@master: xxx@master: invalid version: unknown revision master

meta data 不匹配

> go get -v git.xxx.com/xx/go-lib-websocket@gomod
go get git.xxx.com/xx/go-lib-websocket@gomod: unrecognized import path "git.xxx.com/xx/go-lib-websocket": parse <http://git.xxx.com/xx/go-lib-websocket?go-get=1:> no go-import meta tags (meta tag 192.168.1.254/xx/go-lib-websocket did not match import path git.xxx.com/xx/go-lib-websocket)

迁移到 git module

  • 历史版本管理工具
    • dep
    • glide
  • 如何从历史版本管理工具迁移
    • go mod init creates a new go.mod file and automatically imports dependencies from Godeps.json, Gopkg.lock, or a number of other supported formats.
  • 如何从内网git仓库迁移到类似github的标准仓库
    • 必须加域名,否则代码里充斥了很多 IP
    • 加了域名,相当于包名都改了
    • 所有引用它的包都要改引用方式,改动量非常大
    • 临时方案
      • 在本地用 replace 方式引用
      • 改动本地的库的名字,以及库里代码的引用名字
  • remote import paths 如何工作
    • go - Remote import paths
      • When using GOPATH, downloaded packages are written to the first directory listed in the GOPATH environment variable. (See ‘go help gopath-get’ and ‘go help gopath’.)
      • When using modules, downloaded packages are stored in the module cache. (See ‘go help module-get’ and ‘go help goproxy’.)
  • 最终方案:

go mod 小范围迁移方案


   转载规则


《go module 实践》 bill 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
linux下使用tcpdump执行如下命令抓包,然后在windows使用Wireshark分析报文 linux下使用tcpdump执行如下命令抓包,然后在windows使用Wireshark分析报文
linux下使用tcpdump执行如下命令抓包,然后再windows使用Wireshark分析报文 tcpdump -i interface -xxx -vvv -s 0 -w aa.cap interface填网口名
2020-02-11
下一篇 
Golang设置国内代理 Golang设置国内代理
Golang V1.13之后支持通过设置变量GOPROXY来修改代理地址,默认的代理服务器https://proxy.golang.org在国内访问经常出现timeout 可以通过设置国内代理来加速下载 详见:https://github
2019-07-11
  目录