• Go Module 常见问题


    随处可见的 GO111MODULE=on

    在 GitHub 上,经常看到不少项目的 readme 里都有这么一句:

    ✗ GO111MODULE=on go get golang.org/x/tools/gopls@latest
    

    2009 年,Go 被官方发布的时候,没有自带包管理功能。go get 命令会根据 import 路径,把所有源码下载到$GOPATH/src目录下。这导致,我们无法对依赖包进行版本控制,只有master分支能代表一个包的稳定版本。

    Go 1.11 版本中,引入了 Go Modules (即,Go 模块),可以通过 go.mod 文件存储依赖包的版本号。

    从那时起,GOPATH模式Go模块模式之间的交互就成为了Go最大的陷阱之一。
    要想避开这些陷阱,离不开一个环境变量——GO111MODULE

    GO111MODULE=on 是干嘛用的

    简单来讲,GO111MODULE=on会开启 Go 模块模式,允许用户在 go get 时指定依赖包的版本。

    ✗ GO111MODULE=off go get golang.org/x/tools/gopls@v0.1.8
    go: cannot use path@version syntax in GOPATH mode
    # 报错:GOPATH模式无法指定版本
    

    使用 go get 时,go.mod 会自动更新

    这里要小心踩坑。默认情况下,如果当前目录下有 go.mod 文件,go get 命令会把你刚刚安装的依赖包更新到 go.mod。

    在 安装一些开发工具(比如gopls, kind)时,如果你不想更新 go.mod 文件,可以使用cd && go get命令避免污染 go.mod 。

    go get VS go install

    • go get: 解析、添加 pkg 之间的依赖关系,然后下载、编译、安装pkg。【默认修改go.mod】
    • go install: 编译、安装 代码中import的pkg。【不修改go.mod】
    # 更详细的解释,可见官方文档
    ✗ go help get
    ✗ go help install
    

    不要在 go get 中混用 -u 和 @version

    比如 在使用@latest时,你只想要更新当前包到最新tag。加上-u选项后,go会把这个包的所有依赖包也更新。如果依赖包里有breaking changes,那就坑惨了。

    # 只更新 protos-go
    ✗ go get git.bala.com/hahaha/protos-go@latest
    go: git.bala.com/hahaha/protos-go latest => v0.0.6
    
    # 依赖包也全都更新
    ✗ go get -u git.bala.com/hahaha/protos-go@latest
    go: git.bala.com/hahaha/protos-go latest => v0.0.6
    go: github.com/golang/protobuf upgrade => v1.4.2
    go: google.golang.org/protobuf upgrade => v1.23.0
    
    

    再比如,如果使用@v0.1加上-u选项,go get会获取1.0标签下最新的版本。

    如何修改依赖包内的代码

    有时候,我们import了一个依赖包,但是需要修改其中的代码,怎么办呢?

    • 1)最简单的方法: 在 go.mod 文件最后加上replace
    # 替换成本地路径
    replace github.com/maelvls/beers => ../beers
    
    # 替换成 github 路径
    replace github.com/facebookincubator/ent v0.0.1 => github.com/mine/ent v0.0.1
    
    • 2)使用vendor

    使用 go mod vendor + go build -mod=vendor命令,这会强制 go 使用 vendor/ 目录下的文件,而不是$GOPATH/pkg/mod下的。
    这俩命令,也可以帮助你的 vim 和 VSCode 解决找不到 某个指定版本的包的问题,毕竟现在所有的依赖包都在 /vendor 目录下了。

    如何使用私有库的 pkg

    大家在公司一般使用 Gitlab/Github 上的私有代码库。Go 1.13之后,使用GOPRIVATE变量,我们可以跳过包代理,更快捷地获取私有库代码。

    # 也可以在 .gitconfig 文件中加上相应配置
    git config --global url."https://foo:${GITHUB_TOKEN}@github.com/company".insteadOf "https://github.com/company"
    
    export GOPRIVATE=github.com/company/*
    
    

    参考链接:

  • 相关阅读:
    【剑指offer】07重建二叉树,C++实现
    【剑指offer】06从尾到头打印链表,C++实现
    面向对象设计模式原则01 开闭原则(OCP)
    面向对象设计模式原则02 里氏替换原则(LSP)
    面向对象设计模式原则03 依赖倒置原则(DIP)
    面向对象设计模式原则05 接口隔离原则(ISP)
    面向对象设计模式原则04 单一职责原则(SRP)
    leetcode1218
    leetcode1232
    leetcode1228
  • 原文地址:https://www.cnblogs.com/wwwn/p/12968706.html
Copyright © 2020-2023  润新知