Макет системы управления версиями

Я разрабатываю множество приложений и имею 3-4 различных библиотеки, которые я повторно использую в этих приложениях (одна для математики, одна для функций базы данных и т. Д.).

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

Все они хранятся в магистральном каталоге репозитория Subversion, и когда я разветвляю определенные каталоги, я создаю массивную ветку и т. Д. Это довольно сложно поддерживать обратную совместимость, а также просто сокращать размер кода и локальный размер репозитория.

Как лучше всего справиться с такими ситуациями? Как вы размещаете свои различные проекты.

Вы помещаете каждый проект в отдельный репозиторий Subversion? Или вы используете один репозиторий с несколькими проектами верхнего уровня и стволом / веткой / тегами под ним?

Как вы ссылаетесь на альтернативные проекты? Вы просто компилируете их и ссылаетесь на данные?


person Superman    schedule 01.12.2008    source источник


Ответы (4)


См. Мои ответы на странице рекомендаций по структуре папок проектов и Как вы организовываете свой репозиторий управления версиями?.

Что касается вашего конкретного вопроса, проблема заключается в управлении зависимостями между проектами. Ответ заключается в их версии - каждый проект, который зависит от другого, должен зависеть ТОЛЬКО от двоичного результата этого проекта (или ближайшего эквивалента, если не скомпилированной программы / библиотеки), и этот результат должен быть версирован в каждой такой ссылке. Конечно, сначала вам нужно убедиться, что каждый проект создает ОДИН и ТОЛЬКО ОДИН двоичный результат (или эквивалент).

За счет зависимости только от двоичного результата другого проекта вы делаете каждый проект автономным и значительно упрощаете его обслуживание, поскольку его «интерфейс сборки» представляет собой один файл. Попадание в исходный код / ​​сборку другого проекта похоже на достижение середины реализации библиотеки = множество проблем.

Создавая версии каждого проекта, вы можете изменять исходный код конкретного проекта от имени другого (нового) проекта, но не влиять на другие старые проекты, которые его использовали. По сути, каждый проект становится ПРОДУКТом. Как и с любым другим продуктом, вы должны управлять его выпусками и совместимостью с другими продуктами.

person Rob Williams    schedule 01.12.2008

Мои многоразовые библиотеки разрабатываются в отдельных проектах с отдельными каталогами исходного кода в репозитории (я использую TFS, но он должен быть применим к SVN). Я публикую версии этих библиотек в общем месте - в моем случае это сетевой ресурс, на который имеется ссылка через DFS. При необходимости я добавляю ссылки на опубликованные библиотеки в другие мои проекты. Иногда я использую управление версиями (именованные версии), если обнаруживаю, что по какой-то причине мне нужно поддерживать несколько версий библиотеки. В некотором смысле я отношусь ко всем как к сторонним компонентам и не ссылаюсь на их проекты напрямую.

person tvanfosson    schedule 01.12.2008

Я думаю, вам нужно отдельное решение для общих проектов и иметь собственный процесс сборки для них. Я бы связал их как двоичные ссылки в ваших основных проектах. Вы все еще можете отлаживать этот код с помощью Visual Studio, если у вас есть файлы pdb. Я думаю, что это единственный способ масштабирования, иначе у вас останутся эти проблемы.

Можно подумать о том, чтобы поместить все общие библиотеки в одно место, а локальные проекты создать каталог ext для размещения всех общих связанных двоичных файлов. Затем вы можете написать сценарии для проверки обновленных версий и т. Д., Чтобы не возиться с ручными обновлениями.

person leora    schedule 01.12.2008

Я никогда не использовал Subversion, но могу предоставить некоторую информацию за пределами вопроса о репозитории. Мой ответ: это действительно зависит от сценария и компании. Для одного из самых крупных проектов, в котором я участвовал, мы использовали следующую структуру. Этот проект состоял примерно из 20 основных сборок, которые будут использоваться различными приложениями. Мы также использовали TFS.

Мы определили проект Common TFS, который содержал единое главное решение для сборки всех проектов в общем проекте. Когда мы строим, мы публикуем двоичные файлы.

Затем у нас был проект TFS для каждого бизнес-подразделения и их различных приложений (каждый BU мог иметь от 1 до n проектов / приложений). Затем мы настраиваем приложения для втягивания двоичных файлов в свои собственные проекты, используя ссылку на файл. В этом случае бизнес-подразделения рассматривали общие библиотеки как сторонние продукты.

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

person JoshBerke    schedule 01.12.2008
comment
Не помещайте ничего, что сгенерировано, в систему управления версиями: это не источник. Версионирование выходных двоичных файлов - это здорово, поэтому не ставьте под угрозу его прямые неверсированные зависимости (которые, как вы сказали, создают проблемы совместимости). Полушаги только увеличивают стоимость, но не приносят пользы. - person Rob Williams; 01.12.2008
comment
Правильное размещение их в исходном коде позволило нам контролировать дерево управления версиями и позволило нам легко делать ссылки на файлы без необходимости указывать, где должны быть размещены двоичные файлы. Я согласен, что в большинстве случаев вы не должны помещать сгенерированный результат, но в таких случаях может быть преимущество - person JoshBerke; 01.12.2008