Структура проекта SVN - PullRequest
       16

Структура проекта SVN

3 голосов
/ 07 января 2011

Мы переходим в SVN из VSS и обсуждаем структуру проекта.Мы обсуждаем два предложения, представленные ниже.

Нет.1 кажется более простым для поддержки разработки, поскольку версия выпуска Project привязана к тегу, и разработчику нужно будет только выполнить обновление этого тега, чтобы немедленно приступить к работе.

Нет.2 гарантирует, что все проекты и зависимости могут быть разработаны независимо, но создание конкретной версии выпуска означает знание тегов проекта и всех его зависимостей.

Есть ли очевидные сравнительные преимущества между этими двумя?Есть ли ошибки в двух структурах?или там есть лучшие структуры?

1.
Development  
  + trunk  
    Project1  
    Project2  
    Dependency1  
    Dependency2  
    Dependency3  
  + branches  
  + tags  

2.
Project1  
  + trunk  
  + branches  
  + tags  
Project2  
  + trunk  
  + branches  
  + tags  
Dependency1  
  + trunk  
  + branches  
  + tags  
Dependency2  
  + trunk  
  + branches  
  + tags  
Dependency3  
  + trunk  
  + branches  
  + tags  

Ответы [ 7 ]

5 голосов
/ 07 января 2011

Перейти к # 2:

Project1  
  + trunk  
  + branches  
  + tags  
Project2  
  + trunk  
  + branches  
  + tags  
Dependency1  
  + trunk  
  + branches  
  + tags  
Dependency2  
  + trunk  
  + branches  
  + tags  
Dependency3  
  + trunk  
  + branches  
  + tags  

С проектами, которые должны ссылаться на другие проекты, ознакомьтесь с разделом "SVN Externals" .Это позволяет вам установить конкретную версию SVN зависимости как значение, используемое в другом проекте.

1 голос
/ 12 января 2011

Спасибо всем за то, что помогли мне понять это намного лучше!

@ JasCav, я особенно благодарен за ваше объяснение того, как думать о том, насколько "зависима" конкретная зависимость.У меня есть оба, так что я думаю, что подразумеваемая структура будет:

Project1  
  + trunk  
       SubPrjFor_Prj1
       LibraryExternalRefs
           Dependency1_DLLOnly
           Dependency2_DLLOnly
           Dependency3_DLLOnly_NOT_SHARED_UsedOnlyByPrj1_ONLY_HERE
       LibraryWithSource
           Dependency4_UsedOnlyByPrj1_NOT_SHARED
                Source_SubFolder1
                Source_SubFolder2
  + branches  
  + tags  
Project2  
  + trunk  
       SubPrjFor_Prj2
       LibExternalRefs
           Dependency1_DLLOnly
  + branches  
  + tags  
Dependency1_UsedByBothPrj1Prj2  
  + trunk  
           Dependency1_DLLOnly
  + branches  
  + tags  
Dependency2_UsedByPrj1SoFar  
  + trunk  
           Dependency2_Source_SubPrj1
           Dependency2_Source_SubPrj2
  + branches  
  + tags  

Конечно, я исключил соответствующие структуры для ствола / ветвей.

ps @JasCav, я прошу прощения зане голосовать за вас и не ставить этот пункт под вашим комментарием;У меня, очевидно, нет очков, чтобы делать эти вещи, что не имеет большого смысла для меня.Я думал, что вход в систему позволит мне комментировать и, таким образом, отслеживать интересующие элементы Stackoverflow, но я не думаю.

Редактировать: исправлено форматирование и расширенный пример до 4 зависимостей.

1 голос
/ 07 января 2011

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

Однако вы должны быть умны в том, что ваши зависимости действительно будут делать. Например, если Dependency2 равен only и будет зависимостью для Project1, то он, вероятно, должен просто существовать в исходной структуре Project1. (Примечание: я не имею в виду наличие отдельных веток и тегов для зависимости - я имею в виду, что она находится в другом пакете или другом подпроекте в Project1.)

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

Обновление версий проекта и зависимостей Если вы идете по маршруту №2, и у вас есть отдельные Project и Dependencies, ваше управление версиями на самом деле становится очень простым. Вот схема того, как это может работать.

  1. Команда А работает над Проектом 1.
  2. Команда B работает над зависимостью1, от которой зависит Project1.
  3. Всякий раз, когда команда B заканчивает свою работу, она создает релиз Dependency1 (двоичный файл - возможно, DLL, или библиотека, или что-то в этом роде). Они также могут пометить свой проект в это время. Двоичное имя может быть: Dependency1-v1.0.0
  4. Команда A берет двоичный выпуск Dependency1-v1.0.0 и включает его в свой проект. (Как правило, двоичные файлы хранятся в папке / lib или что-то подобное в проекте.)
  5. Всякий раз, когда команда A заканчивает свою работу, они могут выпустить свой проект и пометить свой проект.

Обратите внимание, что команда A ни в коем случае не извлекает исходный код из Dependency1 и вносит его в свой проект. Это позволяет разрабатывать два проекта независимо друг от друга, так что между группами разработчиков существует автономия. Команда A может использовать бинарный файл так долго или как угодно коротко. Если им нужна обновленная версия, они получают последнюю версию от Team B.

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

1 голос
/ 07 января 2011

Я бы лично пошел с # 2. Мы сделали это в моей предыдущей компании, и это сработало очень хорошо. Он изолировал каждый проект, чтобы вы могли легко просматривать его историю в отношении ветвления и тегов без каких-либо дополнительных усилий. Возможность просто проверить проект и получить все его ветви, теги и ствол - хорошая возможность и при локальном отслеживании различий.

0 голосов
/ 12 января 2011

Вместо того, чтобы хранить только один репозиторий, как предлагают все эти структуры, в другом посте здесь, VSS to SVN - Репозитории , пользователи предлагают иметь один репозиторий на группу.Таким образом, номер редакции SVN будет увеличиваться только после коммитов, сделанных отдельной командой.

Кто-нибудь из вас пробовал этот метод?Есть ли дополнительная служебная работа?

Я бы хотел сохранить чистоту базы кода при минимальном объеме работы по администрированию SVN, так как в моем случае я, вероятно, буду это делать:).

0 голосов
/ 07 января 2011

Мой опыт - это просто вопрос соглашения.И с SVN Book проблем тоже нет.

В одном из проектов команда использовала сборку ANT и имела более упорную плоскую структуру.У нас был подход № 2.С одним основным build-скриптом.Когда я работал над этим, все было в порядке, и у нас не было никаких проблем.

В текущем проекте используется сборка Maven, так что по умолчанию код over имеет структуру # 1 с одним родителем и ниже, зависимости и модульные проекты.,В SVN мы следуем подходу № 1.Но, если начнется совершенно новый проект, у нас будет смесь № 1 и № 2 в макете.Примерно так:

    Project1
        trunk
            project1A
            project1B
            dependency1C
            dependency1D
        branches
        tags
    Project2
        trunk
            project2A
            dependency2B
        branches
        tags

Подводя итог, я бы хотел, чтобы мой репозиторий был логически отделен.Итак, чтобы ответить на ваш вопрос - я бы предпочел подход № 2.

Правка № 1: URL-адрес SVN-Book фиксирован

0 голосов
/ 07 января 2011

Если все проекты являются частью одного решения или продукта, я бы использовал подход № 1.

Я использую следующую структуру:

TRUNK
--Build
--Product
----Source
------Project1
------Project2
------Project3
----Test
--ThirdParty

Каталог ThirdParty предназначен для зависимостей, не связанных с исходным кодом, таких как библиотеки или API.

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

...