svn: модульная организация на ранней стадии разработки

Хорошо, я понимаю, что ствол / теги / ветки для репозитория с одним проектом.

Теперь предположим, что у меня есть основной проект и несколько небольших вспомогательных модулей / плагинов / инструментов / скриптов и т. Д. На ранних этапах происходит много переименований, реорганизаций и т. Д., И некоторые из них умирают рано, потому что уходят в никуда., Мне не имеет смысла вставлять конкретный модуль в магистраль, пока организация не станет достаточно стабильной. (в этот момент копирование в транк "дешево" в соответствии с дизайном SVN)

Где было бы лучше всего разместить небольшой модуль (скажем, "FooModule") в начале процесса разработки?

  • / филиалы / разработка /FooModule?
  • / разработка /FooModule?
  • / песочница / модули /FooModule?

У кого-нибудь есть опыт организации хранилищ Subversion подобным образом? что сработало для вас?

6 ответов

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

1) положить все в багажник:

http://svn/application/trunk/application

2) если можете, начните рано разбивать код на модули

http://svn/application/trunk/application1
                             module1
                             module2

3) если модуль стабилен, переместите его вверх по течению в свой собственный репозиторий:

http://svn/module1/trunk

4) наконец, когда у вас есть несколько стабильных модулей и приложений, вы можете получить

http://svn/application1/trunk
http://svn/application2/trunk
http://svn/module1/trunk
http://svn/module2/trunk

каждое приложение / модуль имеет свой собственный цикл выпуска.

Кроме того, вы можете взглянуть на то, что делает Spring Framework (очень хорошая организация, если вы спросите меня)

http://svn/application1/trunk
http://svn/application2/trunk
http://svn/framework/trunk/module1
http://svn/framework/trunk/module2

Я бы посоветовал не разбивать код на транк / ветви для каждого модуля, по крайней мере, в начале проекта: как только вы начинаете ветвление (и не работаете на транке), вы не можете работать с ГОЛОВКАМИ транка других модулей. больше: вам нужно либо разветвлять все свои проекты одновременно, либо работать с конкретными версиями (1.0, а не SNAPSHOT). Я не думаю, что я очень ясно, но дайте мне знать, если я должен объяснить это по-другому.

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

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

app1/
    trunk/
    tags/
    branches/
app2/
    trunk/
    tags/
    branches/
sandbox/
    trunk/
    tags/
    sure_you_could_keep_the_parallelism_up_here_but_is_there_really_any_need/

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

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

Я не уверен, соответствует ли моя организационная структура вашим потребностям, но я использовал совсем другой подход, чем модель trunk/tags/branch. За подробностями обращайтесь на http://www.mattwrock.com/post/2009/10/10/The-Perfect-Build-Pard-2-Version-Control.aspx.

Вот наша структура:

/prod
/prod/app1/20090903
/prod/app1/20090917
/prod/app2/20090903
/sandbox
/sandbox/users/mwrock
/staging
/staging/app1
/staging/app2
/trunk
/trunk/libraries
/trunk/desktop
/trunk/docs
/trunk/services
/trunk/sql
/trunk/testing
/trunk/thirdparty
/trunk/web

Здесь у нас есть следующие корневые папки:

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

    Песочница: Это области личного развития, используемые для ветвления долгосрочных изменений, которые вы хотите хранить отдельно от ствола, пока они не будут готовы для объединения обратно в ствол.

    Постановка: это последняя область QA/UAT. Ствол копируется сюда, когда считается, что разработка стабильна и готова к финальному тестированию. Это защищает релиз от разработки, переданной в ствол другими командами. Когда релиз находится на этой стадии, вы не хотите, чтобы неизвестные коммиты от кого-то еще входили в вашу кодовую базу.

    Prod: Это содержит производственные выпуски. Каждое приложение имеет свою собственную папку в prod, и у каждого выпуска есть папка, названная в честь даты ее выпуска. Промежуточная ветвь копируется в эти теги выпуска при развертывании, и они представляют собой снимок кода на момент выпуска. Область Prod - это исторический отчет о том, что именно было выпущено и когда.

Я не могу редактировать пост Дэвида, но хочу кое-что упомянуть svn:externals: они довольно опасны с точки зрения выпуска (IMO). Вот сценарий кошмара:

Давайте представим, что вы svn:externals некоторый код модуля внутри вашего приложения; ради этого, давайте представим, что версия Subversion 1000 для модуля. Вы создаете филиал, делаете релиз и отправляете его клиенту.

Время идет, и через пару месяцев / лет клиент просит вас исправить проблему в приложении. Вы проверяете ветку и начинаете svn updating проект. К сожалению, связанный модуль сильно изменился и теперь имеет версию 23456. И теперь приложение даже не компилируется.

Конечно, что вы должны сделать, так что измените svm:externals указать точную версию (1000), когда вы разветвились. И если вам нужно изменить код модуля, то вам нужно указать сейчас на заголовок ветви, созданной для модуля в ревизии 1000.

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

Если у вас был хороший опыт работы с svn:externals Я весь внимание.

/branches/dev/FooModule было бы самым разумным подходом, если вы действительно не хотите иметь его в багажнике с самого начала ИМХО. Это то, для чего нужны ветки разработки (за исключением того, что обычно это происходит наоборот, код там копируется из транка, а затем в конечном итоге возвращается в транк).

Я бы определенно избегал необычных корневых путей, как в двух других приведенных вами примерах. Дальнейшие соображения вы найдете в разделе "Контроль версий с Subversion".

Другие вопросы по тегам