Облегчение git-слияний с помощью мультипакетных модулей go - PullRequest
0 голосов
/ 28 января 2019

У нас есть две версии модуля go, размещенные разными людьми.Давайте назовем их example.org/devproject и company.com/project.Разные программы, очевидно, импортируют два проекта по разным путям импорта, в зависимости от ситуации, в зависимости от того, хотят ли они версии, поддерживаемой example.org или company.com.Поскольку модули имеют множество внутренних пакетов, сами исходные файлы содержат ссылки на имя своего собственного модуля во многих операторах импорта.

Мой вопрос заключается в том, как example.org может максимально облегчить извлечение company.comиз нашего репозитория git, потому что прямо сейчас прямое git портит операторы import.Обратите внимание, что у переполнения стека есть похожие вопросы по этому поводу перед тем, как перейти к модулюТем не менее, этот вопрос относится конкретно к проектам с файлами go.mod, использующими go 1.11 или более поздней версии, поэтому, пожалуйста, не отсылайте меня на немодульные ответы и не предлагайте пока не использовать go модули, потому что это другой вопрос.

Я пробовал следующее, что, к сожалению, не очень хорошо работает:

  • Используйте какое-нибудь абстрактное имя модуля, например module self, в файле go.mod и добавьте replace self => example.org/devproject.Тогда внутренние пакеты могут просто import "self/subpackage", и только одна строка replace должна меняться между репозиториями.Однако это означает, что все проекты, включая проекты, должны использовать директиву replace, и нам нужно убедить company.com изменить весь их импорт относительно «self», что маловероятно.Что еще более важно, это полностью нарушает go get и, вероятно, является плохой идеей.

  • Используйте полуавтоматические сценарии для поддержки ветки git pull-me, которая всегда ровно на один коммит вперед master, но все пути импорта и файл go.mod исправлены для company.com.Это то, что мы делаем в настоящее время, но это раздражает, потому что сценарии не знают, как анализировать исходный код, поэтому просто слепо заменяйте example.org/devproject на company.com/project везде, то есть нет гарантии, что только потому, что master работает pull-me тоже будет.Мы почему-то не можем заставить gomvpkg работать в модуле go за пределами gopath (это изменит операторы пакета, но не импорт, который является сложной частью, и не будет повторяться во всех подпакетах).

  • Создайте поддельный гопат, скопируйте в него основную ветвь, используйте gomvpkg, чтобы переместить материал, затем скопируйте файлы с измененным путем импорта, затем удалите поддельный гопат.Я не могу на 100% исключить это, но я сдался после того, как gomvpkg просто продолжал отказываться делать правильные вещи, и я был разочарован тем, что что-то настолько концептуально простое было так трудно сделать на практике.

Есть ли другие решения, которые мы должны рассмотреть?Существуют ли какие-либо инструменты, такие как govmpkg, которые понимают модули go и будут переписывать пути импорта, не пытаясь также перемещать объекты в gopath?

Как очевидно, динамика в example.org здесь гораздо большемотивирован, чтобы получить материал, а компания.com - это от нас, поэтому в идеале большая часть прыжков должна быть на стороне example.org, и, возможно, единовременный простой ненавязчивый запрос к company.comсделать что-нибудь, чтобы сделать эту работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...