Ответ 1
С Go1.6, когда вы читаете, вендинг встроен. Что это значит? Помните только одно:
При использовании инструментов
go
, таких какgo build
илиgo run
, они сначала проверяют, находятся ли зависимости в./vendor/
. Если да, используйте его. Если нет, вернитесь в каталог$GOPATH/src/
.
Фактические "пути поиска" в Go 1.6 имеют порядок:
./vendor/github.com/zenazn/goji
$GOPATH/src/github.com/zenazn/goji
$GOROOT/src/github.com/zenazn/goji
С учетом сказанного go get
продолжит установку в вас $GOPATH/src
; и go install
будет установлен в $GOPATH/bin
для двоичных файлов или $GOPATH/pkg
для кэширования пакетов.
Итак, как я могу использовать. /vendor?!?!
Хе-хе, вооруженный знанием выше, это довольно просто:
mkdir -p $GOPATH/src/ou/vendor/github.com/zenazn/goji
cp -r $GOPATH/src/github.com/zenazn/goji/ $GOPATH/src/ou/vendor/github.com/zenazn/goji
Короче говоря, чтобы использовать вендование, вы копируете файлы, используя тот же самый путь github.com/zenazn/goji
, в свой директор поставщика.
Теперь утилита go build/install/run увидит и использует вашу папку поставщика.
Более простой способ вместо копирования всего вручную
Вместо поиска и копирования всех 25 продуктов-поставщиков, управления их версиями, обновления других проектов и т.д.... Лучше использовать инструмент управления зависимостями. Есть много вещей, и небольшой поиск в Google укажет вам несколько.
Позвольте мне упомянуть два, которые работают с папкой поставщика и не сражаются с вами:
- godep
- govendor
Вкратце, эти инструменты проведут проверку вашего кода ou
, найдут удаленные зависимости и скопируют их из вашего $GOPATH/src
в ваш каталог $GOPATH/src/ou/vendor
(фактически, независимо от того, в каком текущем каталоге вы находитесь, когда вы их запускаете).
Например, скажем, что все ваши зависимости установлены и нормально работают в вашем проекте $GOPATH/src/ou/
, используя обычную установку ваших зависимостей GOPATH/src/github. Ваш проект работает, и ваши тесты проверяют, что все работает с точной версией ваших репозиториев. Например, с помощью Godep вы запустите это из корневой папки проекта $GOPATH/src/ou/
:
godep save ./...
Это скопирует все зависимости, которые ваш проект использует в вашей папке. /vendor.
Городе очень важен самый популярный. У них есть собственный канал Slack в группе Gopher Slack. И это тот, который я использую в своих командах.
Govendor - еще одна альтернатива, которую я прочитал, имеет приятную синхронизацию. Я не использовал его, хотя.
Использование инструмента управления зависимостями
Это чисто мнение, и я уверен, что ненавистники будут снижать ставку... Но поскольку мне нужно закончить мой пост в блоге по этому вопросу, позвольте мне упомянуть здесь, что большинство людей слишком беспокоиться о управлении репутацией в Go.
Да, необходимо блокировать репо для версии, на которую вы зависите, чтобы обеспечить, чтобы ваша система строилась на производстве. Да, есть необходимость в том, чтобы не нарушать никаких изменений в зависимости от того, как зависимость прерывает что-то.
Используйте управление зависимостями для этих целей.
Но существует чрезмерное использование простых проектов, которые блокируют огромное количество зависимостей, когда на самом деле...
Вам может потребоваться только заблокировать только 1 зависимости; в противном случае вы хотите получить последнюю версию драйверов MySQL и фреймворков тестирования для исправления ошибок.
Здесь можно реально использовать папку ./vendor/
, отличную от инструментов управления зависимостями: вам нужно будет только скопировать это репо, в которое вы должны быть заблокированы.
Вы выборочно выбираете одно неподходящее репо и помещаете его в свою папку. /vendor/. Делая это, вы говорите своим потребителям:
Эй, это одно репо должно быть сдержано в этой ревизии. Все остальные в порядке и используют последние из них и часто обновляют с помощью
go get -u ./...
; но это не удалось с более новыми версиями, поэтому не обновляйте это одно репо.
Но если вы полностью сохраняете все свои зависимости с помощью инструмента управления зависимостями, вы в основном говорите своим потребителям:
Может быть или не быть проблемой с одним или несколькими репозициями из 20 в папке поставщика. Вы можете или не сможете обновить их. Вы можете или не сможете получить последний драйвер MySQL. Мы просто не знаем, что может или не может быть причиной проблем и просто заблокировано чем-то, что работало в то время, когда я бежал
godep save
. Так что да, обновляйся на свой страх и риск.
Лично я столкнулся с этим несколько раз. Зависимость обновлялась с изменением разбиения, и у нас есть десятки зависимых от него репозиториев. Приобретение только одного репо в /vendor позволяет нам использовать эту версию зависимости, а go get ./...
продолжает нормально работать для всех остальных репозиториев, чтобы получить последнюю версию. Мы запускаем последние исправления ошибок в PSQL и MySQL и другие (для них есть постоянные исправления!) И т.д.