[devel] [#219699] DONE (try 2) del=golang-tools

Alexey Gladkov legion на altlinux.ru
Чт Фев 21 00:17:03 MSK 2019


On Wed, Feb 20, 2019 at 01:12:21PM +0300, Denis Pynkin wrote:
> > Гораздо правильнее будет завендорить их, а эти пакеты удалить.
> 
> Так у нас появилось уже внятное полиси про пакетирование Golang?

Раньше не было никакого vendor и go.mod. Было только дерево исходников и
уверение апстрима, что этого всего будет достаточно и они знают секрет как
это всё поддерживать в рабочем состоянии без версионирования.

Их секретное кунг-фу было поддержка обратной совместимости в master до
самой первой версии и если что-то ломаешь, то делать новый модуль.

Но спустя несколько лет к апстриму пришло осознание, что поддерживать
обратную совместимость и переименовывать модули не работает даже внутри
гугла. Разработчик может даже удалить модуль с github.com и тем самым
сломать других. Поэтому им пришлось ввести vendor директории, где можно
сохранить копию кода зависимостей. Но гугл не был бы гуглом если бы не
пошёл своим путём. Они не сделали сохранения ни какой информации о том,
что лежит в vendor. Там просто код. Поэтому появилось множество сторонних
проектов, которые сохраняли инфу о версиях и обновляли копию кода (godep,
glide, gpm, dep, vndr и т.д.).

Учитывая всё сказанное выше в тот момент, когда я начал паковать golang
было вроде логично сделать скрипты и макросы, чтобы упростить упаковку
исходников в общее дерево и обновлять их и проверять по зависимостям rpm
кто от модуля зависит.

Оглядываясь назад я считаю, что это было ошибкой.

Сейчас в golang осознали, что версии всё-таки нужны. В golang 1.11
создадут модули с semver, но с своими особенностями. Будет поддержка
vendor директории. Для интересующихся:

https://github.com/golang/go/wiki/Modules

После работы с довольно большими проектами на golang я сейчас считаю, что 
класть зависимости в vendor директорию единственный способ как
поддерживать проекты на golang. Если не просто класть код руками туда, а
использовать go.mod или godep, то понять кто с чем собран становится
достаточно просто.

Модули в пакетах всё равно не дают выигрыша так как после обновления
модуля нужно пересобрать всех конечных потребителей (цепочка зависимостей
может быть длинной).

> Лично я бы с удовольствием выкинул бы те 30+ пакетов-зависимостей,
> которые пришлось вливать ради LXD.
> 
> Можно ли глянуть на какой-нибудь пакет, где используется вендоринг?

http://git.altlinux.org/gears/m/md2man.git

или вот апстримные проекты:

https://github.com/docker/distribution
https://github.com/kubernetes/kubernetes
https://github.com/etcd-io/etcd

-- 
Rgrds, legion



Подробная информация о списке рассылки Devel