Мы разрабатываем программное обеспечение.NET Enterprise на языке C #. Мы стремимся улучшить нашу систему контроля версий. Раньше я использовал mercurial и экспериментировал с ним в нашей компании. Однако, поскольку мы разрабатываем корпоративные продукты, мы уделяем большое внимание повторно используемым компонентам или модулям. Я пытался использовать субрепозитории mercurial -для управления компонентами и зависимостями, но у меня возникли некоторые трудности. Вот основные требования к системе контроля версий/управлению зависимостями:
. Вот структура в mercurial, которую я использовал:
SHARED1_SLN-+-docs
|
+-libs----NLOG
|
+-misc----KEY
|
+-src-----SHARED1-+-proj1
| +-proj2
|
+-tools---NANT
SHARED2_SLN-+-docs
|
+-libs--+-SHARED1-+-proj1
| | +-proj2
| |
| +-NLOG
|
+-misc----KEY
|
+-src-----SHARED2-+-proj3
| +-proj4
|
+-tools---NANT
PROD_SLN----+-docs
|
+-libs--+-SHARED1-+-proj1
| | +-proj2
| |
| +-SHARED2-+-proj3
| | +-proj4
| |
| +-NLOG
|
+-misc----KEY
|
+-src-----prod----+-proj5
| +-proj6
|
+-tools---NANT
Если Боб работает над PROD1, а Алиса работает над SHARED1, как Боб может узнать, когда Алиса вносит изменения в SHARED1. В настоящее время с Mercurial Боб вынужден вручную извлекать и обновлять каждое подрепозиторий. Если он отправляет/вытягивает на сервер из репозитория PROD _SLN, он никогда не узнает об обновлениях подрепозиториев. Это описано в Mercurial wiki .Как Боб может быть уведомлен об обновлениях вложенных репозиториев, когда он получает последнюю версию PROD _SLN с сервера? В идеале он должен быть уведомлен (предпочтительно во время извлечения ), а затем должен вручную решить, какие подрепозитории он хочет обновить.
Предположим, что SHARED1 ссылается на NLog v1.0 (commit/rev abc в mercurial ), а SHARED2 ссылается на Nlog v2.0 (commit/rev xyz в mercurial ). Если Боб усваивает эти два компонента в PROD1, он должен знать об этом несоответствии. Хотя технически Visual Studio/.NET позволяет двум сборкам ссылаться на разные версии зависимостей, моя структура не позволяет этого, поскольку путь к NLog фиксирован для всех проектов.NET, зависящих от NLog. Откуда Бобу знать, что у двух его зависимостей есть конфликты версий?
Если Боб настраивает структуру репозитория для PROD1 и хочет включить SHARED2, как он может узнать, какие зависимости требуются для SHARED2? С моей структурой ему пришлось бы вручную клонировать (или просмотреть на сервере )репозиторий SHARED2 _SLN и либо просмотреть папку libs, либо просмотреть файл.hgsub, чтобы определить, какие зависимости ему нужны. включать. В идеале это должно быть автоматизировано. Если я включаю SHARED2 в свой продукт, SHARED1 и NLog также автоматически -включаются магическим образом, уведомляя меня о конфликте версии с какой-либо другой зависимостью (, см. вопрос 2 выше ).
Является ли ртуть правильным решением?
Есть ли лучшая ртутная структура?
Является ли это допустимым использованием для вложенных репозиториев (, т.е. разработчики Mercurial пометили вложенные репозитории в качестве крайней возможности )?
Имеет ли смысл использовать mercurial для управления зависимостями? Мы могли бы использовать еще один инструмент для управления зависимостями (, может быть, внутренний канал NuGet? ). Хотя это будет хорошо работать для сторонних зависимостей,это действительно создало бы проблемы для компонентов, разрабатываемых внутри компании (, то есть, если бы они активно разрабатывались, разработчикам пришлось бы постоянно обновлять фид, нам пришлось бы обслуживать их внутри, и это не позволяло бы модифицировать компоненты проектом-потребителем. (Примечание 8 и вопрос 2 ).
У вас есть лучшее решение для программных проектов Enterprise.NET?
Я прочитал несколько вопросов SO и нашел этот полезным, но принятый ответ предлагает использовать специальный инструмент для зависимостей. Хотя мне нравятся функции такого инструмента, он не позволяет изменять и фиксировать зависимости из проекта-потребителя (, см. большой вопрос 4 ).