Как правильно структурировать большую кодовую базу для нескольких приложений в SVN? - PullRequest
1 голос
/ 07 октября 2010

В настоящее время у нас есть один репо с кодировкой, http://John.svn.cvsdude.com, с одним проектом SVN http://John.svn.cvsdude.com/MyProject,, который содержит несколько подкаталогов для отдельных решений Visual C ++

Все это началоськак одно приложение, и хотя мы разделили отдельные библиотечные проекты для последующего повторного использования, это все тот же проект SVN.Допустим, мы стремимся иметь несколько приложений с некоторым перекрытием в используемых библиотеках. Как правильно / лучше всего это настроить в SVN?Конечно, можно просто сохранить один проект SVN и поместить проекты-приложения и проекты-библиотеки в качестве вложенных каталогов, но вряд ли это как-то кажется правильным., LibraryD, где все это отдельные проекты / решения ... как бы вы организовали это под одним (или более репо)?Есть ли лучшая практика?

Ответы [ 3 ]

2 голосов
/ 06 января 2011

это Джек из CollabNet, Codesion Cloud Services. Во-первых, спасибо за то, что вы являетесь клиентом Codesion!

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

Например, все ли эти приложения и библиотеки выпускаются одновременно? Полностью самостоятельно? Какой-то микс? Этот ответ может измениться?

Если все они выпускаются одновременно, то важно как можно проще определить, какие версии каждого приложения были выпущены с какими версиями других приложений. Таким образом, отчеты об ошибках можно проверить, внедрить исправления и объединить все исправления согласованным и согласованным образом. Чтобы достичь этого, я бы не использовал бы структуру "/ app / {trunk, tags, branch}", предложенную несколькими, а скорее придерживался канонической

/trunk/app1
/trunk/app2
/tags/TAGNAME/app1
/tags/TAGNAME/app2
/branches/BRANCHNAME/app1
/branches/BRANCHNAME/app2

структура. Это позволяет вам разветвлять, маркировать и объединять все дерево, все приложения и библиотеки одной командой:

svn cp URL/trunk URL/tags/TAGNAME

С другой стороны, если эти вещи независимы, тогда вам лучше с

/app1/trunk
/app1/tags
/app1/branches
/app2/trunk
/app2/tags
/app2/branches
...

Таким образом, например, пометка одного приложения не влияет на другое.

В смешанном случае вы все равно можете добиться скоординированного ветвления (когда это уместно), но вам придется использовать ветвление изнутри вашей рабочей копии и, возможно, разреженные извлечения (если рабочие копии большие). Кроме того, вы можете пометить или разветвить весь репозиторий, даже если тег или ветвь не имеют значения для большинства из них: теги и ветви Subversion дешевы в хранении, и (если вы используете форму URL-to-URL-адреса "svn cp" ") дешево сделать; единственная причина не помечать вещи несвязанными тегами, это смущает людей. Но это довольно веская причина, поэтому смешанную модель лучше всего обрабатывать структурой «app / trunk», чтобы избежать путаницы.

Хорошие примеры подхода "/ app / trunk" можно найти в репозитории Apache Foundation. Все проекты Apache (включая сам Subversion) хранятся в одном хранилище Subversion. Там около 100 проектов, и хотя есть некоторые взаимозависимости, все они в значительной степени управляются независимо. Вы можете просмотреть этот гигантский репо (возможно, самый большой репозиторий Subversion в публичном мире), начиная с корня всех проектов ASF . На практике есть некоторое разнообразие, но один хороший пример - Сам Subversion .

Также стоит отметить: что касается Subversion, вы всегда можете изменить этот материал. «Теги» и «ветви» на самом деле просто копии; Вы можете изменять вещи так, как вам нравится, когда вам нравится. Но есть некоторые предостережения:

  • Это запутает людей
  • «Конфликты деревьев» (добавление, удаление, перемещение или переименование файлов или каталогов) могут сделать последующие объединения болезненными. Функция инструмента слияния - сохранить вашу работу. Все инструменты слияния в конечном итоге, для достаточно сложного слияния, возвращают решения людям; важный вопрос - сколько они могут получить право без этого. Древовидные конфликты приводят к тому, что текущая Subversion (1.6 или лучше) работает намного чаще, чем вам хотелось бы. Поэтому лучше не переставлять каталоги верхнего уровня, подобные этим, и быть готовым вмешаться и очиститься от любых слияний, пересекающих такие перестановки.
2 голосов
/ 07 октября 2010

Я бы сохранил все в одном репозитории и поместил бы каждый проект и библиотеку в отдельный корневой каталог репозитория (см. Планирование организации репозитория * для деталей).

Имейте в виду, что структура хранилища не обязательно должна быть идентичной структуре файлов проекта на диске.

Также я бы использовал svn-externals для совместного использования каталогов библиотеки (хранящихся в виде отдельных корневых папок хранилища) среди различных проектов.

0 голосов
/ 09 октября 2010

Я бы порекомендовал следующий макет, все в одном репозитории:

App1\
    trunk
    tags
    branches
App2\
    trunk
    tags
    branches
App3\
    trunk
    tags
    branches
LibraryA\
    trunk
    tags
    branches
LibraryB\
    trunk
    tags
    branches
LibraryC\
    trunk
    tags
    branches
LibraryD\
    trunk
    tags
    branches

Теперь я делаю несколько предположений относительно вашего графика выпуска.Я предполагаю, что каждое приложение и библиотека выпускаются по разным графикам.На самом деле это наихудший сценарий, но моя схема это допустит.Каждое приложение должно предварительно скомпилировать свои зависимости и включить его в свой каталог в хранилище.Вот как будет выглядеть приложение App1, учитывая, что оно зависит от библиотек B и C:

App1\
    trunk\
        deps\
            LibraryB, release 1.1
            LibraryC, release 4.3
    tags
    branches

Это означает, что всякий раз, когда вы ветвитесь по стволу, вы получите необходимые библиотеки, что значительно упрощает работу.Обратите внимание, что это скомпилированные двоичные файлы библиотек, а не их исходники.

Ветвь ствола будет использовать вышеуказанные версии, и, поскольку вы не можете изменять их, любые исправления ошибок необходимо будет добавить в App1,Между тем, чтобы использовать новые версии LibB & C, вы можете обновить их версии в транке, когда они выпущены командой библиотек.Таким образом, через некоторое время ваш репозиторий может выглядеть следующим образом:

App1\
     trunk\
         deps\
             LibraryB, release 1.3
             LibraryC, release 4.4
     tags\
         release-1.0\
             deps\
                 LibraryB, release 1.1
                 LibraryC, release 4.3
     branches\
         stable-2.0\
             deps\
                 LibraryB, release 1.2
                 LibraryC, release 4.2

Для работы в транке разрешено использовать последние версии библиотек.В release-1.0 используются фиксированные выпуски (здесь самая старая версия), в то время как стабильная ветвь использует предыдущую версию библиотек.

Приведенная выше схема - это то, о чем я много думал у моего последнего работодателя, но никогдадошли до реализации.Чтобы это работало, вам нужно иметь кодовую базу, которая разбита на приложения / библиотеки, и разработка может осуществляться параллельно.Это не совсем так для нас.Но я уверен, что это стоящая цель.

Удачи!

PS Я настоятельно рекомендую против svn: externals.Они могут значительно усложнить управление филиалами.Например, если внешнее изменение и ветвь зависят от него, вы рискуете испортить эту ветку (например, сделать ее не компилируемой).

...