go - 如何从 gitlab 子组加载模块?

标签 go

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

所以我创建了新模块并将其拉入我的 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

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

我在 $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
)

最佳答案

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

要克服此限制,Gitlab 尚未提供解决方案,您可以使用以下两种方法之一:

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

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

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

最后,导入您的模块的项目应该有一个如下所示的 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
)

关于go - 如何从 gitlab 子组加载模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67924850/

相关文章:

go - 在 docker 容器中生成一个新进程,该进程是从头开始构建的

json - 如何发送一组 map 并使用 gin-templating 对其进行迭代

go - 加载包内容而不使用其名称

go - [0] 和 [ :1] in Go? 有什么区别

go - 使用 GOMAXPROCS 进行并行编程

go - 如何与 gorilla 复用器建立无状态连接?

go - Go 中的常量在初始化期间建立

amazon-web-services - 即使控制台关闭也继续运行 golang 项目

go - 删除目录和所有子目录

java - Golang 与 Java 的速度