有没有更简单的方法来更新本地 Go 包

Is there an easier way to keep local Go packages updated

我正在使用导入到不同项目中的多个包,这些包包括由 lambda 和 google 云函数和其他 public 包共享的用于我的业务逻辑的自定义适配器。我现在这样做的方式是我出售它们并将它们包含在云功能中。对于可以在虚拟机上编译部署的应用,我都是单独编译的。这对我来说很好,但是,开发这些模块很痛苦。

如果我更新包中的方法签名和名称,我必须将我的更改推送到 github / gitlab(我的包路径类似于 gitlab.com/groupName/projectName/pkg/packageName)然后执行go get -u <pacakgeName> 更新包。

这也并没有真正更新它,有时会卡在旧版本上而不知道如何更新它。我想知道有没有更简单的方法来处理这个问题。


为了清楚起见:

导出包 1 路径:gitlab.com/some/name/group/pkg/clients/psql

psql-client
    |
    |_ pkg
        |
        |_psql.go

应用程序 1 使用 psql-client 路径:gitlab.com/some/name/app1

应用程序 2 使用 psql-client 路径:gitlab.com/some/name/app2

go get 是可传递的,因此您可以将其添加到构建过程中。一个典型的 Go 项目构建基本上是:

go get -u ./... && go test ./... && go build ./cmd/myapp

获取和更新依赖项,运行所有项目测试,然后构建二进制文件。

我的理解是 (a) 您正在使用 new Go modules system,并且 (b) 部分问题是您不想继续将更改推送到 github 或 gitlab在进行本地开发时跨不同的存储库。

换句话说,如果您在本地进行更改,听起来您不想通过 github/gitlab 往返这些更改,以便这些更改在您的相关存储库中可见正在本地工作。

最重要的建议

单个存储库中有 > 1 个模块会使您的工作流程变得非常复杂。

如您的示例所示,一般来说,在单个存储库中拥有 > 1 个模块几乎总是需要持续进行更多工作。也很难做到正确。对于大多数人来说,成本几乎总是不值得的。此外,好处通常不是人们所期望的,或者在某些情况下,在回购协议中拥有 > 1 个模块没有实际好处。

我肯定会建议您遵循 通常遵循的规则“1 个 repo == 1 个模块”,至少现在是这样。 有更多关于原因的详细信息。

使用多个存储库

鉴于您正在使用 Go 模块,一种方法是您可以将 replace 指令添加到模块的 go.mod 文件中,以通知该 Go 模块有关其他 Go 模块的磁盘位置。

示例结构

例如,如果您有三个存储库 repo1repo2repo3,您可以克隆它们,以便它们在您的本地磁盘上彼此相邻:

myproject/
├── repo1
├── repo2
└── repo3

然后,如果 repo1 依赖于 repo2repo3,您可以为 repo1 设置 go.mod 文件以了解磁盘上的相对位置其他两个模块的位置:

repo1 go.mod:

replace github.com/me/repo2 => ../repo2
replace github.com/me/repo3 => ../repo3

当您在 repo1 目录或其任何子目录中时,go 命令如 go buildgo test ./.... 将使用磁盘版本repo2repo3.

repo2 go.mod:

如果repo2依赖于repo3,你还可以设置:

replace github.com/me/repo3 => ../repo3

repo3 go.mod:

例如,如果 repo3 不依赖于 repo1repo2,那么您不需要在其 [=14= 中添加 replace ].

其他详细信息

replace 指令在模块 wiki 上的 replace FAQ 中有更详细的介绍。

最后,这取决于您的具体用例,但此时常见的解决方案是使用 gohack, which automates some of this process. In particular, it creates a mutable copy of a dependency (by default in $HOME/gohack, but the location is controlled by $GOHACK variable). gohackalso sets your current go.mod file to have a replace 指令指向该可变副本。