Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to load modules from gitlab subgroup?

Tags:

go

I wrote a program and want to encapsulate some logic.

So I did new module and pull it in my git. Link for git looks like gitlab.xxx.ru/group/subgroup/proj but when I tried to get it with go get, I got error

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

Go tried to load subgroup instead project.

I made folder gitlab.xxx.ru/group/subgroup/ in $GOPATH/src/ and clone my project.

And now it wrote

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

So, if I understand correctly, in Golang 1.16 I can't just put my project in the correct directory and I can't use local packages.

How to fix loading from my GitLab and load it with ssh?

Thank you.

UDP go.mod in my proj.

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
)
like image 552
mamol Avatar asked May 15 '26 11:05

mamol


1 Answers

You may be hitting the intended behaviour from Gitlab which will prevent go from fetching the list of subgroups while trying to compute project dependencies. Since go get requests are unauthenticated, existing projects not under the root group are invisible and cannot be found.

To overcome this limitation, which Gitlab has yet to provide a solution, you can use one of the following two approaches:

  • Have the project located at the root and not in a subgroup (not always possible)
  • Leverage the .git extension as well as the replace directive in the project which imports your module (see below)

Go is able to fetch the project living under a subgroup if it knows the version control qualifier (.git). To indicate this, make sure you import the project using the following format gitlab.xxx.ru/group/subgroup/proj.git

While this alone works, it would force you to have all those .git in your imports. To overcome this, you also need a replace directive in your go.mod so you can use the original import path.

In the end, the project which imports your module should have a go.mod that look like this:

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
)

like image 130
Abstulo Avatar answered May 17 '26 01:05

Abstulo