Golang 依赖管理最佳实践

标签 go

在Golang中,我们可以指定GitHub上的开源库作为依赖。例如:

import "github.com/RichardKnop/somelibrary"

这将尝试根据您的 Go 版本寻找分支,如果我理解正确的话,默认为 master。

因此无法导入特定版本的依赖项,例如:

import "github.com/RichardKnop/somelibrary#v1.4.8"

那么在 Go 中管理依赖项的最佳实践是什么?

我可以看到两种方法。

我。版本模块

是否为具有重大更改的主要版本创建新模块?

例如,我的 Go 库可以定义模块 v1 和 v2,这样您就可以:

import "github.com/RichardKnop/somelibrary/v1"

或者:

import "github.com/RichardKnop/somelibrary/v2"

根据您的需要。对 v1 或 v2 所做的任何更改都需要不破坏任何 API 或工作功能。

二。 fork

这会让您完全控制您的 Go 代码所需的外部依赖版本。

例如,您可以将 github.com/RichardKnop/somelibrary fork 到您自己的 GitHub 帐户中,然后在您的代码中执行:

import "github.com/ForkingUser/somelibrary"

然后你将不得不 fork 所有看起来有点过分的外部依赖项。但是,它会让您完全控制版本。您可以将您的 fork 保持在您知道正在使用您的代码的版本,并且只有在您检查新版本的依赖项不会破坏任何内容后才更新 fork 。

想法?

最佳答案

二月。 2018 年:如果将 vgo 集成到工具链中,下面介绍的 vendor 方法(2015/2016 年)可能最终会消失。
参见 my answer below .


2015 年 8 月版:Go 1.5 带有内置(但仍处于试验阶段) vendor 支持。设置环境变量 GO15VENDOREXPERIMENT 将使 go build 和 friend 在 ./vendor 目录和 GOPATH 中寻找包>。参见 VonC's answerdesign document了解更多详情。


三。供应

据我所知,这是确保您的构建可重现和可预测的最广泛使用的方法。 Go 团队本身 uses vendoring在他们的 repo 协议(protocol)中。 Go 团队现在正在讨论统一的依赖 list 文件格式。来自Go toolchain developers mailing list :

In Google’s internal source tree, we vendor (copy) all our dependencies into our source tree and have at most one copy of any given external library. We have the equivalent of only one GOPATH and rewrite our imports to refer to our vendored copy. For example, Go code inside Google wanting to use “golang.org/x/crypto/openpgp” would instead import it as something like “google/third_party/golang.org/x/crypto/openpgp”.

(...)

Our proposal is that the Go project,

  • officially recommends vendoring into an “internal” directory with import rewriting (not GOPATH modifications) as the canonical way to pin dependencies.

  • defines a common config file format for dependencies & vendoring

  • makes no code changes to cmd/go in Go 1.5. External tools such as “godep” or “nut” will implement 1) and 2). We can reevaluate including such a tool in Go 1.6+.

关于Golang 依赖管理最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35328975/

相关文章:

mysql - 如何解析MySQL错误

interface - 通过引用设置接口(interface){}参数

go - 如何按照 api 指南将 json 解码为 golang 中的结构

go - 为什么一些 golang.org 包以 `x` 为前缀

go - 如何获得 cgo (golang) 的语法高亮显示

regex - 用于查找格式错误的引用字符串的正则表达式

windows - 如何在 Windows 中获取驱动器的总大小

c++ - Qt5上的静态库 : Undefined symbols for architecture x86_64:

go - 提供静态内容并处理 404 not found with Gorilla toolkit

mysql - 零到多 : Cannot add or update a child row: a foreign key constraint fails