首页 > 解决方案 > 如何从 gitlab 子组加载模块?

问题描述

我写了一个程序,想封装一些逻辑。

所以我做了新模块并将其拉入我的git。git 的链接看起来像 gitlab.xxx.ru/group/subgroup/proj 但是当我尝试使用 go get 获取它时,我得到了错误

fatal: «https://xxx.ru:@gitlab.xxx.ru/group/subgroup.git/» unreachable: URL using bad/illegal format or missing URL

去尝试加载子组而不是项目。

我在 $GOPATH/src/ 中创建了文件夹 gitlab.xxx.ru/group/subgroup/ 并克隆了我的项目。

现在它写了

could not import gitlab.xxx.ru/group/subgroup/proj (no required module provides package "gitlab.xxx.ru/group/subgroup/proj")

所以,如果我理解正确的话,在 Golang 1.16 中我不能只将我的项目放在正确的目录中,也不能使用本地包。

如何修复从我的 GitLab 加载并使用 ssh 加载它?

谢谢你。

我的项目中的 UDP go.mod。

module gitlab.xxx.ru/group/subgroup/proj

go 1.16

require (
    golang.org/x/sys v0.0.0-20210608053332-aa57babbf139
    golang.org/x/text v0.3.6
)

标签: go

解决方案


您可能会遇到 Gitlab 的预期行为,这将阻止 go 在尝试计算项目依赖项时获取子组列表。由于go get请求未经身份验证,因此不在根组下的现有项目是不可见的,无法找到。

为了克服这个 Gitlab 尚未提供解决方案的限制,您可以使用以下两种方法之一:

  • 让项目位于根目录而不是子组中(并非总是可能)
  • 在导入模块的项目中利用.git扩展和替换指令(见下文)

如果 Go 知道版本控制限定符 (.git),则它能够获取位于子组下的项目。为了表明这一点,请确保使用以下格式导入项目gitlab.xxx.ru/group/subgroup/proj.git

虽然仅此一项有效,但它会迫使您将所有这些都包含.git在您的导入中。为了克服这个问题,您还需要一个replace指令,go.mod以便您可以使用原始导入路径。

最后,导入你的模块的项目应该是go.mod这样的:

require(
 gitlab.xxx.ru/group/subgroup/proj v1.7.0
)

replace(
 gitlab.xxx.ru/group/subgroup/proj => gitlab.xxx.ru/group/subgroup/proj.git v1.7.0
)


推荐阅读