Мы начинаем новый проект SOA с множеством общих сборок .net. Код этих сборок будет храниться в SVN.
На этапе разработки мы хотели бы иметь возможность кодировать эти сборки как единое решение с минимальным «трением» SVN.
Когда проект переходит в режим обслуживания, сборки будут обслуживаться на индивидуальном уровне.
Не превращая ветвление, тегирование и автоматические сборки в кошмар обслуживания, как лучше всего организовать эти библиотеки в SVN, который также хорошо работает с VS 2008 IDE?
Вы настраиваете Trunk / Branch / Tags на каждом уровне библиотеки и пытаетесь каким-то образом спагетти во время компиляции, или лучше сохранить все это как один большой проект с реплицируемым здесь и там кодом для простоты? Есть ли решение с использованием externs?





Что мы сделали с общими сборками на этапе разработки (в проекте, в котором их было множество), так это то, что мы поместили их в место типа общего сетевого ресурса (N Drive), и каждый разработчик ссылался на них оттуда.
Наш процесс сборки всегда будет обновлять этот общий ресурс до последних версий. Таким образом, фактические сборки никогда не должны были храниться в системе управления версиями. Только код.
В нашей компании мы создали репозиторий инструменты, а затем репозиторий проект. Репозиторий инструменты - это репозиторий Subversion, организованный следующим образом:
/svn/tools/
vendor1/
too11/
1.0/
1.1/
latest = a copy of vendor1/tool1/1.1
tool2/
1.0/
1.5/
latest = a copy of vendor1/tool2/1.5
vendor2/
foo/
1.0.0/
1.1.0/
1.2.0/
latest = a copy of vendor2/foo/1.2.0
Каждый раз, когда мы получаем новую версию инструмента от поставщика, она добавляется под своим поставщиком, именем и номером версии, а тег «последняя» обновляется.
[Уточнение: это НЕ типичный репозиторий исходного кода - он предназначен для хранения определенных версий «установленных» образов. Таким образом, /svn/tools/nunit/nunit2/2.4 будет вершиной дерева каталогов, содержащего результаты установки NUnit 2.4 в каталог и его импорта в репозиторий инструментов. Исходный код и примеры могут присутствовать, но основное внимание уделяется исполняемым файлам и библиотекам, которые необходимы для использования инструмента. Если бы нам нужно было изменить инструмент поставщика, мы бы сделали это в отдельном репозитории и опубликовали бы результат в этом репозитории.
Одним из поставщиков является моя компания, и у нее есть отдельный раздел для каждого инструмента, сборки и всего, что мы выпускаем внутри компании.
Репозиторий проекты - это стандартный репозиторий Subversion, с транками, тегами и ветвями, как вы обычно ожидаете. Любой проект будет выглядеть так:
/svn/
branches/
tags/
trunk/
foo/
source/
tools/
publish/
foo-build.xml (for NAnt)
foo.build (for MSBuild)
В каталоге инструментов есть набор свойств Subversion svn: externals, который ссылается на соответствующую версию (либо конкретную версию, либо «последнюю») каждого инструмента или сборки, которая требуется для этого проекта. Когда CruiseControl.NET создает проект 'foo', задача публикации заполняет каталог 'publish', поскольку сборка 'foo' предназначена для развертывания, а затем выполняет следующие команды подрывной деятельности:
svn import publish /svn/tools/vendor2/foo/1.2.3
svn delete /svn/tools/vendor2/foo/latest
svn copy /svn/tools/vendor2/foo/1.2.3 /svn/tools/vendor2/foo/latest
Разработчики работают над своими проектами как обычно, и пусть автоматизация сборки позаботится обо всех деталях. Обычное обновление Subversion извлекает последние версии внешних инструментов, а также обновления проекта.
Если у вас много взаимозависимостей между инструментами, вы можете настроить CruiseControl.NET (вручную), чтобы запускать сборки для подчиненных проектов при изменении их зависимостей, но нам пока не нужно заходить так далеко.
Note: All of the Subversion repository paths have been shortened for clarity. We actually use Apache+SVN, and two separate servers, but you should adapt this as you see fit.
Спасибо. Я много думал (и исследовал), прежде чем внедрить его.
Хороший общий ответ! Вопросы: 1. Как вы сохраняете исторические снимки, если SVN: Externals указывает на «последний», а не на тег / номер ревизии? 2. Как вы разветвляете источник вашего поставщика? Возможно, лучше было бы преобразовать в '/ tool1 / trunk /', '/tool1/tags/REL-1.2.3/' и '/ tool1 / branch / BUG-blah /'?
(1) Свойство svn: externals версировано. Если вы укажете конкретную версию и при необходимости измените ее, это решит вашу проблему. Обычно мы используем тег «latest» для инструментов и библиотек сборки и тестирования, которые не входят в состав продукта. (2) Отредактировано для пояснения.
Благодарю за разъяснение. На самом деле я пытаюсь организовать внутренние библиотеки исходного кода И результирующие общие двоичные файлы. Приношу свои извинения, если мой вопрос не был ясен.
Спасибо за быстрый ответ, но я имею в виду хранение сборок проектов. Немного подчистил вопрос. Итак, если у меня есть решение TierA, которое изменяет исходный код Assembly1 и Assembly2, и у меня есть решение TierB, которое изменяет исходный код Assembly2 и Assembly3, какой хороший способ организовать SVN?