Подтвердить что ты не робот

Лучшая практика управления репутацией Голанга

В 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"

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

Мысли?

4b9b3361

Ответ 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>