Лучшая практика управления репутацией Голанга
В Golang мы можем указать библиотеки с открытым исходным кодом на GitHub в качестве зависимостей. Например:
import "github.com/RichardKnop/somelibrary"
Это попытается найти ветвь на основе вашей версии Go и по умолчанию будет работать, если я правильно понимаю.
Таким образом, нет способа импортировать конкретную версию зависимости, например:
import "github.com/RichardKnop/somelibrary#v1.4.8"
Какова наилучшая практика для управления зависимостями в Go тогда?
Я вижу два подхода.
I. Модули версии
Создать новые модули для основных версий с нарушениями?
Например, моя библиотека Go может определять модули v1 и v2, чтобы вы могли:
import "github.com/RichardKnop/somelibrary/v1"
Или:
import "github.com/RichardKnop/somelibrary/v2"
Основываясь на том, что вам нужно. Любые изменения, внесенные в v1 или v2, потребуются, чтобы не нарушать какие-либо API-интерфейсы или рабочие функции.
II. Ветвление
Это даст вам полный контроль над версией внешней зависимости, которую требует ваш код Go.
Например, вы можете форк github.com/RichardKnop/somelibrary в свою собственную учетную запись GitHub, а затем в вашем коде:
import "github.com/ForkingUser/somelibrary"
Затем вам нужно будет разблокировать все внешние зависимости, которые кажутся немного излишними. Однако это даст вам полный контроль над версиями. Вы могли бы держать свои вилки в той версии, которую, как вы знаете, работаете с вашим кодом, и только обновлять вилки после того, как вы проверили, что новые версии зависимостей ничего не нарушают.
Мысли?
Ответы
Ответ 1
Примечание. Июнь 2015 года первая поддержка для поставщиков появится в Go 1.5!
См. c/10923/:
Когда GO15VENDOREXPERIMENT=1
находится в среде, этот CL изменяет разрешение путей импорта в соответствии с предложением поставщика Go 1.5:
- Если существует исходный каталог
d/vendor
, то при компиляции исходного файла внутри поддерева, корневого в d
, import "p"
интерпретируется как import "d/vendor/p"
, если это существует. - Когда есть несколько возможных разрешений, выигрывает самый конкретный (самый длинный) путь.
- Короткая форма всегда должна использоваться: путь импорта не может содержать "
/vendor/
" явно. - Импорт комментариев игнорируется в пакетах поставщиков.
Обновление в январе 2016 года: Go 1.6 будет предлагать по умолчанию.
И как подробно описано в статья "САМЫЕ НАСТРОЙКИ ИНСТРУМЕНТОВ СЕЙЧАС РАБОТЫ С GO15VENDOREXPERIMENT" :
1.6 обеспечивает поддержку /vendor/
для большинства инструментов (например, оракула) из коробки; используйте Beta для их восстановления.
Ответ 2
февраль 2018: представленный ниже подход к продаже (в 2015/2016 году) может исчезнуть, если vgo интегрирован в инструментальную цепочку.
См. мой ответ ниже.
Август 2015 версия: Go 1.5 поставляется со встроенной (но все же экспериментальной) поддержкой вендоров. Установка переменной окружения GO15VENDOREXPERIMENT
сделает go build
, а друзья ищут пакеты в каталоге ./vendor
, а также GOPATH
. Подробнее см. Ответ VonC и проектный документ.
III. Vendoring
AFAIK, это наиболее широко используемый способ обеспечения того, чтобы ваши сборки были воспроизводимыми и предсказуемыми. Сама команда Go использует vendoring в своем репо. Команда Go теперь обсуждает формат файла унифицированного файла манифеста. Из Список рассылки разработчиков Toolchain Go:
В внутреннем дереве исходных текстов Googles мы продаем (копируем) все наши зависимости в нашем исходном дереве и имеем не более одной копии любой данной внешней библиотеки. У нас есть эквивалент только одного GOPATH и переписываем наш импорт, чтобы ссылаться на нашу копию с продавцом. Например, код Go внутри Google, который хочет использовать "golang.org/x/crypto/openpgp", вместо этого импортирует его как нечто вроде "google/third_party/golang.org/x/crypto/openpgp".
(...)
Наше предложение состоит в том, что проект Go,
-
официально рекомендует продавать во внутреннем каталоге с перезаписи импорта (а не с модификациями GOPATH) в качестве канонического способа привязки зависимостей.
-
определяет общий формат файла конфигурации для зависимостей и поставщика
-
не вносит никаких изменений кода в cmd/go в Go 1.5. Внешние инструменты, такие как godep "или" nut "будет реализовывать 1) и 2). Мы можем переоценить, включая такой инструмент в Go 1.6 +.
Ответ 3
Обновление от 2018 года, 3 года спустя.
Существует новый подход, разработанный Russ Cox, из ядра Golang команда разработчиков.
Проект vgo.
go get -u golang.org/x/vgo
Код>
Это предложение:
- хранит лучшие части
go get
, - добавляет воспроизводимые сборки,
- принимает семантическое управление версиями,
- устраняет предложение,
- обесценивает <код > GOPATH в отношении рабочего процесса на основе проекта и
- обеспечивает плавный путь миграции из
dep
и его предшественников.
![vgo semver]()
Он основан на новом алгоритме MVS ( "Минимальная версия выбора" ):
![https://research.swtch.com/version-select-2.png]()
Вы можете видеть:
Май 2018: Artifactory предлагает прокси vgo
В недавнем выпуске Artifactory 5.11 добавлена поддержка vgo-совместимых реестров Go (и go proxy), предоставляющих сообществу множество возможностей при разработке с Go.
Вот лишь некоторые из них:
- Локальные репозитории в Artifactory позволяют настраивать защищенные частные реестры Go с мелким контролем доступа к пакетам в соответствии с проектами или группами разработчиков.
- Удаленный репозиторий в Artifactory - это кеширующий прокси для удаленных ресурсов Go, таких как проект GitHub. Доступ к прокси-серверу через Artifactory удаляет вашу зависимость от сети или в GitHub, поскольку все зависимости, необходимые для ваших сборок Go, кэшируются в Artifactory и поэтому доступны на местном уровне. Это также устраняет риск того, что кто-то изменит или удалит зависимость от контроля версий или, что еще хуже, приведет к форсированию изменений в удаленном теге Git, тем самым изменив то, что должно быть неизменной версией, которая может создать много путаницы и нестабильности для зависимых проектов.
- A виртуальный репозиторий объединяет локальные и удаленные реестры Go, предоставляя вам доступ ко всем ресурсам Go, необходимым для ваших сборок, с одного URL-адреса, скрывая сложность использования комбинации локальных и удаленных ресурсов.
Ответ 4
также можно просто описать зависимости в maven, если использовать mvn-golang-wrapper, в случае, если он похож на maven как ниже текста
<plugin>
<groupId>com.igormaznitsa</groupId>
<artifactId>mvn-golang-wrapper</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>golang-get</id>
<goals>
<goal>get</goal>
</goals>
<configuration>
<packages>
<package>github.com/gizak/termui</package>
</packages>
<buildFlags>
<flag>-u</flag>
</buildFlags>
<goVersion>1.6</goVersion>
</configuration>
</execution>
</plugin>