Управление зависимостями .NET и тегирование / ветвление - PullRequest
9 голосов
/ 14 декабря 2009

Моя компания испытывает трудности с поиском наилучшего способа управления нашими сборками, выпусками и ветками ... Наша основная настройка состоит в том, что у нас есть 4 приложения, которые мы обслуживаем, 2 приложения WPF и 2 приложения ASP.NET, все 4 из этих приложений общие библиотеки, поэтому в настоящее время они находятся в одной папке / trunk / {app1, app2, app3, app4}.

Это очень затрудняет ветвление / маркировку одного приложения, потому что вы разветвляете все 4 одновременно, поэтому мы хотели бы разделить его на что-то вроде {app1, app2, app3, app4} / {trunk, теги, ветки}, но тогда мы сталкиваемся с вопросом, куда поместить общие библиотеки?

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

Есть советы? Идеи?

В настоящее время мы используем svn и cruisecontrol.net.

РЕДАКТИРОВАТЬ: Общие библиотеки часто меняются на данный момент, поэтому мы не можем использовать их как внешние SVN для транка, потому что мы могли бы изменить их в ветви. Поэтому мы не можем использовать их как двоичные ссылки.

Также очень сложно тестировать и отлаживать, когда библиотеки статически собираются вместо включения исходного кода.

Ответы [ 7 ]

6 голосов
/ 14 декабря 2009

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

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

4 голосов
/ 03 июня 2010

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

http://refix.codeplex.com

4 голосов
/ 15 декабря 2009

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

Это очень затрудняет ветвление / маркировку одного приложения, потому что вы выполняете ветвление всех 4 одновременно

Я обычно помещаю все свои проекты прямо под транк, как вы делаете сейчас. Затем, когда я создаю ветку релиза или ветвь функций, я просто игнорирую другие проекты, которые выполняются. Помните, что копии дешевы, поэтому они не занимают место на вашем сервере.

Если быть точным, вот как я бы выложил дерево исходных текстов, которое вы описали:

  • Ствол
    • WPF1
    • WPF2
    • ASP.NET 1
    • ASP.NET 2
    • lib1
    • lib2
  • филиалы
    • WPF1 v 1.0
      • WPF1
      • WPF2
      • ASP.NET 1
      • ASP.NET 2
      • lib1
      • lib2
    • WPF1 v 1.1
      • WPF1
    • ASP.NET 1
    • ASP.NET 2
    • lib1
    • lib2
  • lib1 план оплаты
    • WPF1
    • WPF2
    • ASP.NET 1
    • ASP.NET 2
    • lib1
    • lib2
1 голос
/ 09 ноября 2011

Apache NPanday + Apache Maven Release

... может решить ваши проблемы

Он предоставляет вам управление зависимостями (транзитивное разрешение), мощную поддержку управления версиями и автоматическое тегирование / ветвление в 14+ системах контроля версий, включая SVN.

Дайте мне подсказку, если я укажу подробнее.

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

И вы всегда можете делать трюки, чтобы открыть все это в одном решении: -)

Пример рабочего процесса:

  1. Dev 1 build A локально с использованием Maven
  2. Проверки в источниках
  3. Сервер сборки собирает A и развертывает так называемые SNAPSHOT-версии в Repository Manager ( например, Nexus )
  4. Dev 2 две загрузки B, NPanday автоматически разрешит A-libs из менеджера репозитория (не нужно получать исходный код и собирать)
  5. Dev 1 хочет выпустить A: Maven Release создает ветку или тег с вашим источником, завершает работу над версией (удаляя SNAPSHOT) и развертывает артефакты в Диспетчере репозитория.
  6. Dev 2 теперь может обновить B, чтобы использовать окончательный выпуск A (изменить запись в xml или использовать VS-addin для этого)
  7. Теперь Dev 2 может выпустить B, опять же с автоматическим созданием тега или ветви и развертыванием встроенных артефактов.

Если вы хотите предоставить сжатые пакеты в качестве вывода из вашей сборки, Плагин Maven Assembly поможет вам сделать это.

1 голос
/ 15 декабря 2009

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

Моя команда в настоящее время находится на огромной фазе разработки, и каждый в основном должен отрабатывать самые последние и лучшие из совместно используемых библиотек в любой момент времени. В этом случае у нас на каждом диске C: есть папка SharedLibs \ Latest, которая автоматически синхронизируется с последним выпуском разработки каждой из наших общих библиотек. Каждый проект, который следует пить из пожарного рукава, имеет абсолютные ссылки на файлы в этой папке. По мере того, как люди выпускают новые версии общих библиотек, отдельные проекты в конечном итоге прозрачно выбирают их.

В дополнение к последней папке у нас есть папка SharedLibs \ Releases, в которой есть иерархия папок, названных для каждой версии каждой общей библиотеки. По мере того, как проекты завершаются и приближаются к фазе кандидата на выпуск, ссылки на общую библиотеку указываются на эти стабильные папки.

Самым большим недостатком этого является то, что эта структура должна быть в наличии для любого проекта. Если кто-то хочет создать приложение через 10 лет, ему потребуется эта структура. Важно отметить, что эти папки также должны существовать на сервере build / CI.

До этого каждое решение имело папку lib, которая находилась под контролем исходного кода и содержала двоичные файлы. Каждому владельцу проекта было поручено распространять новые общие библиотеки. Поскольку большинству людей принадлежало несколько проектов, часто возникали проблемы с проектами, которые все еще находились в нестабильной фазе. Кроме того, TFS не очень хорошо отслеживает изменения в двоичных файлах. Если бы TFS лучше отслеживал dll, мы бы, вероятно, использовали бы решение / проект совместно используемых библиотек вместо подхода к файловой системе, который мы используем сейчас.

1 голос
/ 14 декабря 2009

Я согласен с @Brian Frantz. Нет причин не рассматривать общие библиотеки как собственный проект, который создается ежедневно, а ваши проекты бинарно зависят от ежедневных сборок.

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

0 голосов
/ 18 августа 2012

Вы можете использовать Apache / IVY в автономном режиме.

http://ant.apache.org/ivy/history/latest-milestone/standalone.html

Мне нужно подчеркнуть режим «в одиночестве». Если вы поищете в Google примеры .... вы найдете множество (не автономных).

В принципе, IVY работает в этой предпосылке.

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

Ниже приведен код PSEUDO, не полагайтесь на мою память.

java.exe ivy.jar -publish MyBinaryPackageOne.xml --revision 1.2.3.4 (<< где .xml относится к N числу файлов, составляющих один пакет.)) </p>

«Пакет» означает группу файлов. Вы можете включить в пакет файлы .dll и .xml и .pdb (что я делаю со сборкой сборок DotNet). Или что угодно. IVY не зависит от типа файла. Если вы хотите разместить WordDocs там, вы могли бы, но sharepoint лучше для документов.

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

java.exe ivy.jar -publish MyBinaryPackageOne.xml --revision 1.2.3.5

потом вы можете получить из IVY то, что хотите.

java.exe ivy.jar -retrieve PackagesINeed.xml 

PackagesINeed.xml будет содержать информацию о пакетах, которые вы хотите.

что-то вроде «Я хочу версию MyBinaryPackageOne версии 1.2+» (определено в xml)

По мере того, как вы строите свои бинарные файлы фреймворка ... вы ПУБЛИКАЕТЕ IVY Затем, когда вы разрабатываете и создаете свой код ... вы ПОЛУЧАЕТЕ из IVY.

В NUTSHELL IVY - это хранилище для ФАЙЛОВ (не исходный код).

Плющ становится окончательным источником ваших двоичных файлов.

Ни один из типов "Эй, у разработчика-Джо нет необходимых нам двоичных файлов".

.......

Преимущества: 1. Вы НЕ держите свои двоичные файлы в системе контроля версий. (и, таким образом, не взрывайте свой источник контроля). 2. У вас есть ОДИН окончательный источник для двоичных файлов. 3. Через конфигурацию XML вы говорите, какие версии вам нужны для библиотеки. (В приведенном выше примере, если версия 2 (2.0.0.0) MyBinaryPackageOne опубликована в IVY (допустим, с изменениями версии 1.2.xy) ... тогда вы в порядке, потому что вы определили в своем извлечении (файл конфигурации xml) ..., что вам нужно только "1.2+". Таким образом, ваш проект будет игнорировать что-либо 2 + ..., если вы не измените пакет конфигурации.

Дополнительно: Если у вас есть машина для сборки (например, CruiseControl.NET) .... вы можете написать логику для публикации ваших (новых) двоичных файлов в IVY после каждой сборки. (Что я и делаю).

Я использую ревизию SVN в качестве последнего номера в номере сборки. Если бы моя SVN-ревизия была «3333», я бы запустил что-то вроде этого:

java.exe ivy.jar -publish MyBinaryPackageOne.xml --revision 1.2.3.3333

Таким образом, при каждом извлечении пакета для ревизии "1.2.3+" .... я получу последнюю сборку. В этом случае я бы получил версию пакета 1.2.3.3333.

Печально, что IVY был запущен в 2005 году (ну, это хорошая новость) ... но что NUGET не вышел до 2010 года? (2011?) ИМХО отстала от Microsoft на 5-6 лет.

Я бы никогда не вернулся к переводу двоичных файлов в систему контроля версий.

IVY очень хорошо. Это время доказано. Решает проблему управления ЗАВИСИМОСТЬЮ.

Требуется ли немного времени, чтобы освоиться с этим? Да.

Но это того стоит.

Мои 2 цента.

.................

Но идея № 2 Узнайте, как использовать NUGET с локальным (например, локальным для вашей компании) репозиторием.

Это примерно то же самое, что и IVY.

Но, посмотрев на NUGET, я все еще люблю IVY.

...