Насколько гранулированы ваши SVN-проекты: один большой проект, содержащий несколько выпущенных приложений или один «проект» на приложение - PullRequest
7 голосов
/ 01 мая 2009

Я определяю проект как каталог SVN, содержащий стволы, ветви, подкаталоги тегов.

Какие критерии вы используете при определении, когда нужно разделить проект на два или объединить несколько проектов в один? - Одно приложение на «Проект» с общими проектами для общего источника и ресурсов? - Один большой «проект», содержащий все источники и ресурсы для приложения?

Одиночный проект или мультипроект, оба имеют свои плюсы и минусы. Мы больше ориентируемся на один проект, и я пытаюсь выяснить, правильный ли это подход.

Сплит-проекты позволяют лучше контролировать, как разные части пакета включают изменения. Общая библиотека может быть версией, и разные приложения могут выбрать конкретную версию (подход управления Maven Dep).

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

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

Итак, когда вы пытаетесь решить, где объединить и где разделить, какие эмпирические правила вы используете?

Ответы [ 10 ]

5 голосов
/ 01 мая 2009

Мы помещаем все проекты, связанные с одним приложением, в один SVN Rep просто для простоты обслуживания, централизации базы кода приложения только в одном репозитории, а также возможности управления взаимозависимостями между различными ресурсами приложения.

мы обычно разделяем наши ресурсы на разные папки в транке. эта классификация в основном основана на функциональной / модульной группировке или многоуровневой группировке [DAL, BLL, GUI и т. д.]. это полностью зависит от того, как вы структурировали код. Надеюсь, это поможет.

4 голосов
/ 01 мая 2009

Книга SVN хорошо обсуждает оба подхода.

В конце я бы выбрал то, что кажется более естественным для пользователей репозитория.

Лично я одобрил единый подход к соединительным линиям / тегам / веткам SVN со всеми моими реальными проектами кода в их собственных папках внутри них.

Однако для большей кодовой базы (я управлял только 3-4 небольшими проектами, которые были частью одного решения), я бы настоятельно рекомендовал перейти на разделенный подход.

3 голосов
/ 01 мая 2009

Я использую как отдельные проекты, так и комбинированные проекты в зависимости от размера проекта. Для наших крупных проектов каждый из них находится в отдельном репозитории и имеет независимые процедуры сборки и развертывания. Для наших небольших проектов у нас есть репозиторий «tools» для их хранения, причем каждый подпроект является подкаталогом корневого каталога.

У меня также есть «персональный» репозиторий, в котором люди могут хранить свои тестовые программы как единовременные утилиты, так и другие вещи, которые могут выиграть от контроля версий и централизованного резервного копирования, но не принадлежат как самостоятельный проект.

2 голосов
/ 02 мая 2009

Расти органично. Предварительная оптимизация - корень всего зла, однажды сказал Дейкстра. Также помните о ЯНГИ (вам это не понадобится).

Каждое приложение получает собственную папку с транком / тегом / ветками. Если проект в приложении становится действительно большим, он помещается в отдельную папку и может быть связан с приложением во время сборки (или даже с svn: externals).

Тем не менее, если ваши требования к проекту состоят в разработке сложного приложения, написанного 10 разработчиками, и вы являетесь привратником или мастером сборки, то вы можете рассмотреть более сложные альтернативы.

2 голосов
/ 01 мая 2009

Одно приложение / модуль, который развертывается независимо для каждого проекта. Использование одного проекта затрудняет введение циклов выпуска, если вы когда-нибудь обнаружите, что вам нужно Maven -ish управление зависимостями с модулем в зависимости от стабильных реализаций других модулей. Это также может привести к тому, что люди будут просто использовать случайный, полезный код из других приложений напрямую, вместо того чтобы вычленять его для сохранения графика зависимостей Sane (tm).

Вы должны проводить интеграционное тестирование, используя надлежащие наборы тестов и методы КИ с четко определенными параметрами, а не полагаться на то, что половина вашего кода внезапно выйдет из строя в случае поломки одной части.

Другая проблема, связанная с наличием одного uber-проекта, заключается в том, что он довольно обременителен для пользователей git-svn, которые работают только с одним модулем.

2 голосов
/ 01 мая 2009

Я использую отдельные проекты и объединяю их для формирования решения через svn: externals.

1 голос
/ 04 мая 2009

здесь нет «хорошего» ответа, но я думаю, что следует проводить различие между репозиториями SVN, которые содержат 1 или 2 проекта, и другими, которые содержат 100.

Я поддерживаю репозиторий SVN, который был перенесен из VSS, в нем несколько сотен «проектов», ни один из них не был организован в соответствии со структурой trunk / branch / tag (на самом деле я думаю, что структура действительно ненужна и бесполезна) после того, как я какое-то время использовал SVN, это, безусловно, не поможет, когда вам нужно пометить 2 или 3 проекта как одно изменение).

Мы поддерживаем каталог проекта для всего нашего поддерживаемого программного обеспечения, в котором у нас есть подкаталоги для конфигурации и еще один для источника. Под этими номерами у нас есть номера версий продукта - так эффективно мы отбрасываем концепцию транка, у нас есть только каталоги тегов - самое большое число является транком (мы должны сделать это, поскольку мы должны поддерживать несколько версий проектов одновременно). Слияние происходит по мере необходимости, поэтому, если я обновлю ошибку в проекте А, версия 3.0; Я объединю эти изменения в версии 4.0 и v5.0.

Если бы я делал репо только с 1 или 2 проектами, у меня может возникнуть соблазн сохранить структуру ветви / тега, но с другой стороны - я бы, вероятно, оставил каталоги явным образом в главном дереве (при условии, что я не выпускался достаточно часто, чтобы помечать теги регулярно) (я использую номер ревизии в качестве «тега», кстати, и храню там двоичные файлы. Поэтому, если мне нужно получить конкретную старую ревизию, я могу получить нужный двоичный файл, посмотрев на бревно)

На удивление легко управлять, учитывая, что у меня репо 10 Гб с ревнумом в настоящее время выше 300 000 с большим количеством старого кода и новым. Я бы порекомендовал эту структуру другим и буду использовать ее снова.

Кстати, еще одна причина, по которой теги dir не будут работать для нас, заключается в том, что мы выпускаем каждый раз, когда появляется ошибка или запрос на изменение, независимо от того, насколько он крошечный. Наш каталог тегов через некоторое время станет неуправляемым, поэтому мы используем revnum в качестве тега - мы можем связать его с трекером ошибок, чтобы сделать его более удобным для чтения человеком.

Итак, чтобы подвести итог, мы имеем такую ​​структуру каталогов, где v1 и v2 - версии продукта:

maint/source/v1.0/projectA
maint/source/v1.0/projectB
maint/source/v2.0/projectA
maint/source/v2.0/projectB
etc

очевидно, мы могли бы поместить dir филиала в 'source', а также ветку / tag в каждом подпроекте, но это было бы сложно, если бы нам нужно было выпустить 2 подпроекта как один запрос на изменение (как мы это делаем довольно часто). Помещение тега subdir в исходный каталог означает, что мы помечаем все, когда изменяется только один подпроект (что не соответствует нашему требованию отслеживать каждый подпроект отдельно)

1 голос
/ 04 мая 2009

Спасибо за ввод. Я не буду «выбирать» ответ, потому что думаю, что во всех есть ценные моменты. Избегание преждевременной оптимизации действительно кажется ключевым, так как делает макет как можно более простым на данный момент. Мы переходим к одному проекту, содержащему приложения, потому что 90% времени мы выпускаем ВСЕ вместе. Следовательно, усложнять вопросы с одним приложением на проект не имеет смысла. Даже когда мы идем в maven, вполне вероятно, что все артефакты maven для данной версии будут сделаны из одной и той же ветви. Мы всегда можем изменить его позже, если потребуется использовать историю SVN и «рыбий глаз», чтобы держать нас в здравом уме.

Мы проведем рефакторинг макета источника так же, как и рефакторинг источника. Когда проект начинает «плохо пахнуть» из-за ситуации с зависимостями, мы разбиваем его, но не раньше. Вероятно, я буду использовать обхват во времени, а не в пространстве: время для сборки и тестирования, время для оформления заказа. Если у меня есть дерево объемом 1 ГБ, которое я могу оформить менее чем за 10 минут, а собрать / протестировать менее чем за 30 минут, мне не нужно его разбирать, если только мне не требуется часто его выпускать.

Итак, спасибо за ввод. Это действительно помогло мне сформулировать вопрос для моей команды и оценить варианты.

1 голос
/ 02 мая 2009

Возможно, вы захотите проверить Номер редакции Subversion для нескольких проектов .

1 голос
/ 01 мая 2009

Храните отдельные репозитории SVN для отдельных проектов. Последнее, что вы хотите, это иметь День слияния

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