0

我正在使用导入到不同项目中的多个包,这些包包括用于我的业务逻辑的自定义适配器,这些适配器由 lambda 和谷歌云函数以及其他公共包共享。我现在这样做的方式是供应它们并将它们包含在云功能中。对于可以在 VM 上编译和部署的应用程序,我将它们分别编译。这对我来说很好,但是,开发这些模块很痛苦。

如果我更新包中的方法签名和名称,我必须将我的更改推送到 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

4

2 回答 2

1

我的理解是(a)您正在使用新的 Go 模块系统,并且(b)问题的一部分是当您进行本地开发时,您不希望跨不同的存储库将更改推送到 github 或 gitlab。

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

最重要的建议

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

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

我肯定会建议您至少现在遵循“1 repo == 1 module”这一普遍遵循的规则。这个答案有更多关于为什么的细节。

使用多个存储库

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

示例结构

例如,如果您有三个 repos repo1, repo2, repo3,您可以克隆它们,使它们在本地磁盘上彼此相邻:

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

然后,如果repo1取决于repo2and repo3,您可以设置go.mod文件repo1以了解其他两个模块的相对磁盘位置:

repo1 go.mod

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

当您在repo1目录或其任何子目录中时,go类似go build或的命令go test ./....将使用 和 的磁盘repo2版本repo3

repo2 go.mod

如果repo2取决于repo3,您还可以设置:

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

repo3 go.mod

例如,如果repo3不依赖于repo1or中的任何一个repo2,那么您就不需要将 a 添加replace到它的go.mod.

额外细节

模块 wiki 上的替换常见问题解答replace中更详细地介绍了该指令。

最后,这取决于您的确切用例,但此时的常见解决方案是使用gohack,它可以自动执行其中的一些过程。特别是,它创建了依赖项的可变副本(默认情况下在 中$HOME/gohack,但位置由$GOHACK变量控制)。gohack还将您的当前go.mod文件设置为具有指向该可变副本的替换指令。

于 2019-08-08T16:21:04.173 回答
0

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

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

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

于 2019-08-08T15:50:37.750 回答