2016-01-13 4 views
5

Я получаю свои руки грязными с Go, и хотя я понимаю и ценю принцип простоты, о том, что Go был построен, я хотел бы понять причину, по которой вы покидаете - в способе управления версиями пакета в свой инструмент выборки зависимостей go get и оператор import.Управление версиями пакетов в Go 1.5

Если я правильно понял, go get и import достать пакет от HEAD, и они не могут обратиться к ветке или тегу. Хотя есть такие инструменты, как gopkg.in, которые обходят это ограничение, официальный набор инструментов:

  1. разработчикам сил, чтобы создать отдельные операции РЕПО для основных (ломки) версий своих продуктов.
  2. Это не позволяет потребителям понижать рейтинги от второстепенных или микро-версий в случае обнаружения ошибок в новых.

По правде говоря, все не так просто, потому что для управления версиями пакетов потребуется стратегия борьбы с противоречивыми транзитивными зависимостями, например. X зависит от A и B, каждый из которых зависит от разных версий C.

Исходя из фона Java, действительно кажется, что это ограничение создает определенные риски и проблемы, среди прочего:

  1. продукта эволюции/упаковки и поломку публичного API, 3-й партии DEPS является неизбежной, поэтому версионности должен быть первоклассным гражданином в инструментальной линейке ИМХО.

  2. The Гит-репо-в-версии политики является крайне неэффективным:

    • Общая история Git пакета теряются или рассеянным по сделкам РЕПО (сливается между версиями, Backports и т.д.)
    • Конфликты с переходными зависимостями все еще могут возникать и будут отображаться незамеченными, потому что язык и инструментальная цепочка накладывают какую-либо семантику, чтобы разрешить обнаружение в первую очередь.
  3. Enterprise Усыновление может быть затруднено и команда развития может уклоняться от языка, при условии, что:

    • Всегда перетаскивание в HEAD означает, что они не могут контролировать или заморозить их 3-й партию DEPS, ведущее к потенциально непредсказуемому конечному продукту.
    • Не хватает рабочей силы, чтобы постоянно обновлять и тестировать свой продукт с помощью верхнего уровня HEAD (не каждая компания в мире - это Google :)).

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

Какую информацию мне не хватает? Как вы относитесь к изменениям пакетов вверх по течению при развертывании Go на предприятии с ограниченными кадрами?

+2

вы можете использовать импортные товары. Путем разработки 'go get', чтобы вытащить из HEAD, он позволяет легче извлекать исправления и заставляет разработчиков API лучше помнить о несовместимых изменениях. Тем не менее, это, безусловно, вопрос, основанный на мнениях, который не по теме для StackOverflow. –

+0

Я вижу. Я изменил формулировку, чтобы избежать основанных на мнениях ответов. Если бы вы могли подробно остановиться на импорте поставщиков - или на другие тактики для развертывания Go на предприятии без необходимости иметь дело с постоянными изменениями в верхнем течении, я был бы признателен. – raulk

ответ

7

Он адресован vendoring, который является частью Go 1.5 в качестве экспериментальной функции, его можно включить, если команда go запущена с GO15VENDOREXPERIMENT=1 в своей среде и будет «полной» функцией в Go 1.6. Также см. Vendor Directories.

Первоначальная дискуссия, которая привела к эксперименту с экспериментом Go 1.5 Vedor, можно найти here.

Сутью является то, что вы создаете папку с именем vendor, и вы помещаете точную версию пакетов, на которые опирается ваш код. Код внутри папки vendor является только импортируемым кодом в дереве каталогов, корнем которого является родительский элемент vendor, и вы можете импортировать пакеты из vendor с пути импорта, как если бы vendor была бы папкой workspace/src (то есть с пути импорта, который опускает префикс до и включая элемент поставщика).

Пример:

/home/user/goworkspace/ 
    src/ 
     mymath/ 
      mymath.go 
      vendor/ 
       github.com/somebob/math 
        math.go 

В этом примере github.com/somebob/math представляет собой внешний пакет, используемый mymath пакета (от mymath.go). Он может быть использован с mymath.go, если он импортируется как:

import "github.com/somebob/math" 

(а не как import mymath/vendor/github.com/somebob/math, который будет плохо.)

1

Хотя Go не приходит со стандартным менеджером пакетов есть достаточно вариантов для делают сборки воспроизводимыми (даже на предприятии с ограниченными кадрами).

  1. Vendoring, который описан в другом ответе от @icza. Это почти полный эквивалент проверки файлов с версией jar в Java. Это был очень распространенный подход с инструментом создания муравьев, прежде чем maven стал популярным. На самом деле, продажа гораздо лучше, потому что вы не можете потерять исходный код.

  2. Это небольшое изменение первого варианта. Вместо того, чтобы проверять исходный код поставщика, вы можете заполнить папку поставщика во время сборки, проверив предопределенные версии зависимостей. Существуют инструменты (например, скольжение), которые автоматизируют этот процесс.

  3. Наконец, вы можете сохранить предопределенные версии всех 3-х партийных библиотек во внутреннем репозитории и добавить его в GOPATH. Этот подход подробно описан в https://blog.gopheracademy.com/advent-2015/go-in-a-monorepo/

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

Java toolchain не имеет концепции версий. Он предоставляется внешним инструментом - maven. Я считаю, что к тому времени, когда Go станет более зрелым и популярным, появится аналогичный стандартный инструмент управления зависимостями.

+0

Мое замечание заключалось в том, что Java даже не пыталась решить проблему сторонних поставщиков пакетов в стандартном наборе инструментов. Java оставила пустоту, заполненную Maven + другими инструментами, основанными на репозитории Maven, и Maven стал де-факто инструментом для этого. И наоборот, Go сделал обращение к стороннему поставщику пакетов в своем наборе инструментов, поэтому он выглядел как упущение, чтобы не думать раньше о версии или управлении поставщиками. Наконец, когда я упоминал о транзитивных зависимостях, я имел в виду семантику Maven для адресации версий и отчетов о конфликтах во время сборки. – raulk

+0

Извините, но это было не очень ясно из вашего вопроса. Я могу только догадываться, что в goch toolchain отсутствует поддержка версий, потому что это никогда не было проблемой для ее авторов (и многих других людей;). Насколько я знаю, Maven не сообщает о конфликтах версий. Он пытается изо всех сил разрешить версии транзитивных зависимостей, хотя часто вам придется явно указывать их в любом случае. – kostya

Смежные вопросы