Сценарий
У меня есть библиотека, содержащая проекты A, B и C.
У меня есть два решения. Решение 1 включает копию проекта A, а решение 2 включает копию проектов A и B.
Когда я создаю решение 1, вот что должно произойти:
alt text http://img689.imageshack.us/img689/9341/onbuildsolution1.jpg
Когда я создаю решение 2, вот что должно произойти:
alt text http://img32.imageshack.us/img32/7821/onbuildsolution2.jpg
Как я могу это сделать?
Я могу ли это автоматизировать с помощью системы управления версиями или готового программного обеспечения для синхронизации файлов? Или мне нужно катить свое решение?
Если я создаю собственное решение, у меня есть некоторые мысли о том, как он может работать, но я был бы признателен за любые ваши данные:
-
Может быть просто консольное приложение с ключом командной строки для указания "исходного решения", например:
c:\Program Files\Library Syncronizer\LibSync.exe /solution:Solution 1
-
XML файл, используемый для регистрации активных решений, содержащих библиотечные проекты. Возможный формат:
<solutions> <solution> <name>Solution1</name> <path>c:\...\Projects\Solution 1</path> </solution> <solution> <name>Solution2</name> <path>c:\...\Projects\Solution 2</path> </solution> <!-- more solutions --> </solutions>
-
Программа выполнит следующие действия:
- Читайте в исходном решении
- Определите, какие проекты библиотеки он имеет.
- Скопировать папки для этих проектов в библиотеку
- Прокрутка каждого решения в файле XML (кроме источника)
- При необходимости скопируйте папки для всех проектов библиотеки
- Возможно, может произойти и операция резервного копирования, на случай, если процесс синхронизации перезапишет что-то важное.
Это звучит относительно просто по понятию, но это может иметь серьезные непредвиденные последствия, о которых я не думаю. Надеюсь, кто-то предупредит меня, если это произойдет:)
Обновление. Какова моя мотивация для копирования папок проекта?
Одним словом - контроль версий.
Если я храню проекты библиотек в отдельной папке и только ссылаюсь на них в своих различных решениях (вместо того, чтобы физически находить папки в папках с решениями), мой репозиторий управления версиями не содержит исходный код для моих библиотечных проектов, Итак, если я обновляюсь до "три версии назад", и мне нужно внести незначительные изменения в один из моих методов библиотеки, кода там нет.
Моим обходным путем для этого было добавить теги к ревизиям в моем репозитории библиотеки, которые говорят такие вещи, как "Решение 1 - Версия 2.5.3", но это довольно неуклюже. И все становится неудобно, если я работаю над "тремя версиями назад" решения 1 и текущей версии решения 2. Теперь решение 2 будет указывать на старую версию библиотечных проектов, что делает ее потенциально невозможной работать с и тестировать, пока я не буду работать над старой версией решения 1.
Если бы я работал с копиями, все решения содержали бы исходный код библиотеки в своих репозиториях, и я мог бы вернуться к нему легко в любое время, когда мне нужно.
Я должен отметить здесь, что я использовал Tortoise HG (Mercurial) для контроля версий.
В любом случае, я открыт для решения этой проблемы. Он не должен включать копирование папок проекта вокруг - это единственное, что я мог подумать о том, чтобы все мои репозитории управления версиями были полными, автономными пакетами.
Обновление 2
Прежде всего, просто заметка. Я использую Mercurial (TortoiseHG) для контроля версий, а не SVN. Я мог бы измениться, если это абсолютно необходимо, но я действительно предпочитаю Mercurial.
На основе ответов до сих пор я решил покончить с идеей "двунаправленного копирования" и вернуться к ссылкам на мои проекты в библиотеке. Здесь новая диаграмма:
alt text http://img30.imageshack.us/img30/7445/referencedprojects.jpg
Я продолжаю иметь те же самые цели:
- В последней версии каждого решения используется последний код библиотеки
- Одно решение/приложение для каждого репозитория
- Каждый репозиторий содержит весь исходный код, включая проекты библиотек
- Все максимально автоматизировано, чтобы свести к минимуму риск ошибок.
Цель № 1 позаботится автоматически, обратившись к библиотечным проектам вместо использования копий, а цель №2 - это только вопрос, как мои настройки моих репозиториев, но цели №3 и №4 остаются неуловимыми.
С Mercurial существует функция subrepositories, которая, похоже, будет обрабатывать мою ситуацию, но, как показывает документация, это все еще считается экспериментальным/рискованные.
На данный момент я думаю, что хорошим решением может быть просто резервное копирование проектов библиотеки в папках Solution. Когда я говорю "резервные копии", я имею в виду это буквально. Я все равно буду ссылаться на проекты библиотеки - копии будут исключительно для обеспечения того, чтобы весь исходный код попадал в мой репозиторий (цель № 3). Чтобы удовлетворить цель №4, эти резервные копии могут быть автоматизированы с использованием события post-build в студии.
Я приветствую ваши мысли об этом.