#go
#Вперед
Вопрос:
У меня есть проект golang, и я поместил код где-то на сервере git. Весь мой код теперь находится в $GOPATH/mygitserver/folder/.
Все является товаром до тех пор, пока gitserver не изменит URL, поэтому мне нужно заменить весь импорт на новый URL gitserver. Итак, я не хочу, чтобы это повторилось в будущем, и хочу изменить способ, которым это работает.
Итак, вместо того, чтобы отправлять пакет только на мой сервер git, теперь я планирую загрузить все рабочее пространство в git (исключая внешнюю библиотеку). Итак, у меня будет пакет непосредственно в папку src (пример: src / mypackage). Итак, когда я изменяю URL gitserver, все по-прежнему будет работать.
Вопрос в том, хорошо ли это делать (загружать рабочее пространство в git)? Или у нас есть другой вариант?
А также возникает другая проблема, которой раньше не было. Итак, после того, как я клонирую свое рабочее пространство, я должен вызвать «go get» для всей моей библиотеки, используемой проектом. (Раньше этого не случалось, потому что, когда я вызываю go get mygitserver / package, Golang автоматически загружает зависимость). Есть ли какой-либо способ сделать так, чтобы все зависимости загружались моей всего одной командой?
Ответ №1:
Если вы ожидаете, что ваш сервер будет часто перемещаться, одним из возможных решений является использование пути импорта тщеславия.
Пути импорта Vanity позволяют сохранять ваш код по пути импорта в вашем домене, который перенаправляет вас в местоположение, где хранится код. Например, если вы размещаете свой код на Bitbucket, но беспокоитесь, что в будущем можете переехать, и вы являетесь владельцем домена example.net
, вы могли бы разместить свой код так, чтобы импортировать его с помощью import "example.net/myproject"
, а за кулисами go get
инструмент извлек бы его из Bitbucket. Для этого вы должны предоставить документ в нужном домене, который содержит пользовательский мета-тег вида:
<meta name="go-import" content="import-prefix vcs repo-root">
Так, например, обслуживание следующего HTML-файла по адресу example.net/myproject
приведет к перенаправлению go get
на клонирование предоставленного URL Bitbucket (он также, конечно, может указывать на любую другую службу Git, включая вашу собственную):
<meta name="go-import" content="example.net/myproject git https://bitbucket.org/myname/myproject.git">
Чтобы настроить Nginx для обслуживания этих перенаправлений, можно использовать конфигурацию, подобную следующей (разумеется, заменив myPackage
и URL-адреса на название вашего проекта и URL-адреса):
location ~ /myPackage/[a-z][a-z0-9]* {
if ($args = "go-get=1") {
add_header Content-Type text/html;
return 200 '<meta name="go-import" content="$host/myPackage git https://bitbucket.org/myName/myPackage.git">';
}
rewrite ^ https://mygithosting.example.org/myName/myPackage? permanent;
}
location ~ /myPackage$ {
if ($args = "go-get=1") {
add_header Content-Type text/html;
return 200 '<meta name="go-import" content="$host/myPackage git https://mygithosting.example.org/myName/myPackage.git">';
}
rewrite ^ https://mygithosting.example.org/myName/myPackage? permanent;
}
Теперь в любой момент, когда вы перемещаете свой Git-сервер, вы можете просто изменить URL в мета-теге.
Если вы беспокоитесь о том, что некоторые пользователи импортируют напрямую с вашего сервера Git, а другие используют путь импорта vanity, вы также можете задать этот путь в качестве канонического пути импорта пакетов. Канонические пути импорта указаны в виде специальных комментариев в package
строке в одном файле программы Go (не имеет значения, в каком именно). Они выглядят следующим образом:
import mypackage // import "example.com/mypackage"
Теперь, если приведенный выше код на самом деле размещен где-то еще, и кто-то попытается импортировать его напрямую, go get
будет жаловаться:
$ go получить mygithosting.example.org/myName/myPackage пакет mygithosting.example.org/myName/myPackage: код в каталоге /go/mygithosting.example.org/myName/myPackage ожидает импорта «example.com/mypackage «
Комментарии:
1. Спасибо за ответ, но считаете ли вы, что загрузка всего рабочего пространства — это хорошо?
2. Ой, извините, да, я мог бы ответить на первоначальный вопрос в начале. Я недостаточно хорошо знаю ваш конкретный вариант использования, чтобы сказать, но в целом я бы сказал «нет, это плохая идея». По мере роста вашего рабочего пространства будет все сложнее управлять, и людям придется создавать обходные пути и хаки, чтобы это соответствовало их обычному процессу разработки (где они могут захотеть, чтобы в их рабочем пространстве были вещи, которых нет в глобальном, но которые они не хотят случайно проверять в Git).