LINUX.ORG.RU

Импорт пакетов в Go из подгрупп Gitlab

 , ,


1

2

Начну сразу с того, что эту тему я создал не для обсуждения GOPATH (юзаю модули, не актуально).

Недавно разрабатываю на Go - и очень смущает факт того, что импорт в этом языке завязан на Github и его особенности. Может я чего-то не так понял, но все же. Например, вот обычный импорт:

import "github.com/username/project"

То есть сначала идет домен, потом юзер, потом проект. Но, кроме Github, есть еще и Gitlab, например. И в нем могут быть группы, в которые вложены другие группы, в которых уже идут проекты. Как правильно сделать импорт таких библиотек? То есть что-то типа такого:

import "gitlab.com/username/customgroup/customsubgroup/project"

И это не работает. Уже извращался с replace (https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-direc...) - не помогло.

Есть какие-то нормальные способы сделать импорт go-либы из Gitlab, которая находится внутри группы?

★★

Последнее исправление: dimuska139 (всего исправлений: 4)

Тыкаешь в гитлабе на Clone по https сносишь от туда https:// и .git, добавляешь нужный путь в проекте

типа, https://gitlab.example.com/group/project.git => gitlab.example.com/group/project/lib/name

Difrex ★★★★
()

То есть сначала идет домен, потом юзер, потом проект.

Не совсем. Если я правильно понимаю (там просто есть всякие костыли для поддержки популярных хостингов) то это обычный git clone url. Соответственно для GL у тебя импорт будет такой же как ссылка для клонирования оттуда.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Так в ссылке для клонирования присутствует как раз и подгруппа в том числе. То есть уровень вложенности отличается от Гитхабовского - и импорт не работает.

dimuska139 ★★
() автор топика
Ответ на: комментарий от beastie

На гитлабе оно тоже было, тут проблема видимо в неких группах юзера.

Deleted
()
Ответ на: комментарий от beastie

Спасибо. А второй шаг (который про Nginx) где надо делать? В смысле у меня есть го локально и репозиторий в Gitlab. О каком Nginx речь? Ведь для разработки на go Nginx не нужен.

dimuska139 ★★
() автор топика
Ответ на: комментарий от tz4678

А зачем, если в го встроенный http-сервер? Это ж не dev-сервер, как в php, например. В продакшене использование Nginx я еще пойму: балансировка, ssl и т.п., но локально-то он зачем?

dimuska139 ★★
() автор топика

Есть какие-то нормальные способы сделать импорт go-либы из Gitlab, которая находится внутри группы?

Нормальные способы импорта — это НЕ импорт чего попало из интернета, что может измениться в любую секунду по велению левой пятки неизвестного тебе чувака, после чего твой код перестанет компилироваться навечно.

В приличных языках есть как минимум версионирование. В go есть copy/paste — то есть, импортирования того, что уже скачано к тебе на диск.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Ну вот представим ситуацию, что ты пилишь проект, состоящий из группы некоторых библиотек (например, смс-шлюз, который использует отдельные библиотеки для каждого опсоса). Ты их запилил, сделал подгруппу в группе гитлаба своего направления - и сунул их туда. Так просто оказалось элементарно удобно, чтобы не пихать все эти библиотеки прямо в группу, чтобы ее не засорять, потому что у вашей конторы проектов дофигища. А также сделал проект, в котором эти библиотеки импортируются.

Вопросы:

1) Чтобы разрабатывать локально проект, использующий эти библиотеки, мне их нужно скопипейстить себе на локальную машину, а в gomod прописать реплейс? Ну это ж ад полнейший. А если мои коллеги внесут изменения в код библиотек, то как я об этом узнаю?

2) Как делать деплой? Также копировать, а потом билд делать?

Это вообще где так разрабатывают?

P.s. «В приличных языках есть как минимум версионирование» - в го есть модули, версионирование в gomod можно указывать. Мой вопрос касался лишь подгрупп гитлаба.

dimuska139 ★★
() автор топика
Ответ на: комментарий от dimuska139

Ну это ж ад полнейший.

Это Go.

Это вообще где так разрабатывают?

Ну, где Go используют. Не в нормальных местах, в общем.

Miguel ★★★★★
()

Не помню как, но я импортировал проект из собственного bare git репозитория на своём сервере безо всяких гитлаб и каких-то проблем с этим не испытал. Собственно и со сторонних гитлабов импортируется всё — только в путь. Никакой магии.

anonymous
()

Да, и гит репозиторием, с ремотом указанным на локальный директорий тоже всё работает.

anonymous
()

импорт в этом языке завязан на Github и его особенности

Вовсе нет. Хоть с Ланчпада импортируйте, если Базар (или как его там) установлен.

По-умолчанию, Го рассматривает удалённый репозиторий как гитовский. И если у Вас гит - то геморроя (пусть и небольшого) быть не должно.

anonymous
()

https://gitlab.com/gitlab-org/gitlab-ce/issues/1337

Короче, покопавшись, Гитлаберы требуют аутентификации, чтобы отдать репо-рут. Ну а там уже зависит от конкретики. Пробовали ли Вы гит конфин инстед оф эйч-ти-ти-пи-эс://гитлаб.ком/ -> эс-эс-эйч... ?

anonymous
()

В общем, не уверен что с Гитлабом сработает. И точно не сработает для гостей.

git config --global url."git@gitlab.tld:".insteadOf "https://gitlab.tld/"

Где gitlab.tld - Ваш Гитлаб.

В итоге go get будет брать сырцы по SSH, и Gitlab будет отдавать корень репозитория вместо запрошенного пути.

Если это не то, что нужно, то либо

  1. патчите исчходники Gitlab, чтобы она не вела себя так застенчиво, либо
  2. перехватывайте HTTP(S) запросы с параметрами URL go-get=1 любым удобным способом
kostyarin_ ★★
()
Ответ на: комментарий от anonymous

Для примера сунул проект библиотеки в группу, внутри которой подгруппа, внутри которой еще одна, в которой уже находится проект: https://gitlab.com/dimuska139testgroup/dimuska139testsubgroup/dimuska139testsubsubgroup/sendpulse-sdk

dimuska139testgroup -> dimuska139testsubgroup -> dimuska139testsubsubgroup -> sendpulse-sdk

Кто-нибудь сможет ее импортнуть в проект? Я попытался:

dimuska139@dimuska139-nb:~/Projects/tstsubgr$ go get gitlab.com/dimuska139testgroup/dimuska139testsubgroup/dimuska139testsubsubgroup/sendpulse-sdk.git
go: finding gitlab.com/dimuska139testgroup/dimuska139testsubgroup/dimuska139testsubsubgroup/sendpulse-sdk.git latest
go: gitlab.com/dimuska139testgroup/dimuska139testsubgroup/dimuska139testsubsubgroup/sendpulse-sdk.git@v0.0.0-20190421133804-e645f668bfe3: parsing go.mod: unexpected module path "gitlab.com/dimuska139testgroup/dimuska139testsubgroup/dimuska139testsubsubgroup/sendpulse-sdk"
go: error loading module requirements

Если надо, то вот фрагмент кода, где эту либу можно подключить:

package main

import (
	"fmt"
	sendpulse "gitlab.com/dimuska139testgroup/dimuska139testsubgroup/dimuska139testsubsubgroup/sendpulse-sdk"
)

const ApiUserId = "12345"
const ApiSecret = "12345"
const ApiTimeout = 5

func main() {
	addressBookId := 12345

	client, e := sendpulse.ApiClient(ApiUserId, ApiSecret, ApiTimeout)
	if e != nil {
		switch err := e.(type) {
		case *sendpulse.ResponseError: // Http error
			fmt.Println(err.HttpCode)
			fmt.Println(err.Url)
			fmt.Println(err.Body)
		default: // Another errors
			fmt.Println(e)
		}
	}

	// Get address book info by id
	bookInfo, e := client.Books.Get(uint(addressBookId))
	if e != nil {
		switch err := e.(type) {
		case *sendpulse.SendpulseError: // Sendpulse error
			fmt.Println(err.HttpCode)
			fmt.Println(err.Url)
			fmt.Println(err.Body)
			fmt.Println(err.Message)
		default: // Another errors
			fmt.Println(e)
		}
	} else {
		fmt.Println(*bookInfo)
	}
}
dimuska139 ★★
() автор топика
Ответ на: комментарий от dimuska139

Или, как в том же сообщении (см. выше) сказано

For credentials, either you can provide a $HOME/.netrc:

machine private.repo.net login YOU password APIKEY

Но, судя по всему, т.к. этот способ прокати только для одного человека/машины, то лучше наверное всё-таки

gitlab.com/username/customgroup.git/customsubgroup/project

Причём, предположительно, это можно прописать в replace в модулях и не менять в коде ничего.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_
dimuska139@dimuska139-nb:~/Projects/tstsubgr$ go get gitlab.com/dimuska139testgroup/dimuska139testsubgroup.git/dimuska139testsubsubgroup/sendpulse-sdk

Зависло напрочь) Через минуты 3 нажал Ctrl + c - прервал.

dimuska139 ★★
() автор топика
Ответ на: комментарий от kostyarin_

А ларчик просто открывался. Надо было вот так:

go get -v gitlab.com/dimuska139testgroup/dimuska139testsubgroup/dimuska139testsubsubgroup/sendpulse-sdk
dimuska139 ★★
() автор топика
Ответ на: комментарий от dimuska139

Я хз, я зарегался в Гитлаб.ком, создал группу, подгруппу, репозиторий и в нём ещё пару вложений. И вот я делаю го гет:

(собственно zorro и есть корень)

$ git config --global url."git@gitlab.com:".insteadOf "https://gitlab.com/"
$ go get -v  gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/zorro/subpro/hello
Fetching https://gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/zorro/subpro/hello?go-get=1
Parsing meta tags from https://gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/zorro/subpro/hello?go-get=1 (status code 200)
get "gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/zorro/subpro/hello": found meta tag get.metaImport{Prefix:"gitlab.com/logrusorgru-group1/subgroup-1", VCS:"git", RepoRoot:"https://gitlab.com/logrusorgru-group1/subgroup-1.git"} at https://gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/zorro/subpro/hello?go-get=1
get "gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/zorro/subpro/hello": verifying non-authoritative meta tag
Fetching https://gitlab.com/logrusorgru-group1/subgroup-1?go-get=1
Parsing meta tags from https://gitlab.com/logrusorgru-group1/subgroup-1?go-get=1 (status code 200)
gitlab.com/logrusorgru-group1/subgroup-1 (download)
# cd .; git clone https://gitlab.com/logrusorgru-group1/subgroup-1.git /home/user/go/src/gitlab.com/logrusorgru-group1/subgroup-1
Клонирование в «/home/user/go/src/gitlab.com/logrusorgru-group1/subgroup-1»…
> GitLab: The project you were looking for could not be found.
fatal: Не удалось прочитать из внешнего репозитория.

Удостоверьтесь, что у вас есть необходимые права доступа
и репозиторий существует.
package gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/zorro/subpro/hello: exit status 128

Внимание на эту хреновину

RepoRoot:"https://gitlab.com/logrusorgru-group1/subgroup-1.git"

Т.е. вместо ожидаемого корня

https://gitlab.com/logrusorgru-group1/subgroup-1/zorro.git
Гитлаб отдаёт мне чуть выше.

Ожидаемый репозиторий

$ git ls-remote git@gitlab.com:logrusorgru-group1/subgroup-1/sub-sub-1/zorro.git
6bc782aa41fb58bc41d188c62f52c53d532b71c5        HEAD
6bc782aa41fb58bc41d188c62f52c53d532b71c5        refs/heads/master

Отданный

$ git ls-remote git@gitlab.com:logrusorgru-group1/subgroup-1.git
> GitLab: The project you were looking for could not be found.
fatal: Не удалось прочитать из внешнего репозитория.

Удостоверьтесь, что у вас есть необходимые права доступа
и репозиторий существует.

Это значит, что несмотря на

insteadOf
, Го сначала делает запрос по HTTPS с тем go-get=1, а Gitlab как неавторизованному клиенту возвращает путь к группе. Т.е. неверный.

А теперь пробую так

$ go get -v  gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/zorro.git/subpro/hello
gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/zorro.git (download)
gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/zorro.git/subpro/hello

Ок, збс. Но это по SSH — ключи все дела. Проверяю что получено.

$ ls $GOPATH/src/gitlab.com/logrusorgru-group1/subgroup-1/sub-sub-1/
zorro.git

Т.е. с суффиксом .git всё таки. Отстой.

Но всё же может прокатить вариант с .netrc. Т.к. без суффикса .git Го сначала делает HTTPS запрос, который должен быть авторизован, чтобы Гилаб отдал корректные данные. Собственно этот вопрос ещё открыт https://github.com/golang/go/issues/26232.

Вопрос лишь в том, схавает ли Гитлаб HTTP Basic Auth из .netrc или нет. Но мне проверять уже лень — там пароль придумывать нужно.

kostyarin_ ★★
()

В общем, небольшая инструкция для тех, кто захотел либы для гошных проектов (при использовании модулей) размещать не по стандартному пути вида domain.com/group/project, а с разбиением на подгруппы: domain.com/group/subgroup/subsubgroup/project.

Сразу скажу, что это все выглядит так себе, но работает. Есть два варианта: когда ваша либа публичная и когда приватная. Сначала выполняете команду

git config --global url."git@gitlab.com:".insteadOf "https://gitlab.com/"

, чтобы go get не просило логин и пароль от гитлаба.

  1. Когда либа публичная. Тут все просто. Импортите либу вот так:

import "gitlab.com/group/subgroup/project"

Все, как обычно. Если Goland не подтянул ее автоматически, то вызываете

go get -v gitlab.com/group/subgroup/project

и смотрите, что пишет. Если пишет «fatal: could not read Username for ‘https://gitlab.com’: terminal prompts disabled» то выполняете «export GIT_TERMINAL_PROMPT=1» — и повторяете запуск го гет, вводя логин и пароль по запросу

  1. Когда либа приватная. В go.mod в первой строке этой либы (не проекта, в который ее импортируете, а именно в go.mod либы) в конце дописываете .git: module gitlab.com/dimuska139testgroup/dimuska139testsubgroup/dimuska139testsubsubgroup/sendpulse-sdk.git

Затем надо добавить новый тег для этой либы. Это важно. В проекте, где либу импортите, делайте импорт вот так (тоже с .git в конце):

import "gitlab.com/dimuska139testgroup/dimuska139testsubgroup/dimuska139testsubsubgroup/sendpulse-sdk.git"

Если все равно нихрена не получилось, то удаляете у проекта go.mod и go.sum — и повторяете действия, которые я написал выше. Все другие, перепробованные мной методы, найденные в интернетах, не работают.

dimuska139 ★★
() автор топика
Ответ на: комментарий от dimuska139

Много чего, зависит от задачи. Где-то идёт в бой чистый C, а где-то пишут на OCaml. Go не имеет области, где он лучший.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Много чего, зависит от задачи. Где-то идёт в бой чистый C, а где-то пишут на OCaml. Go не имеет области, где он лучший

Этот оратор зря замусоривает тему рассуждениями о том, в чём не разбирается.

Partisan ★★★★
()
Ответ на: комментарий от Partisan

Этот оратор зря замусоривает тему рассуждениями о том, в чём не разбирается.

Самокритично.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.