Хорошо, я собираюсь сосредоточиться на общей части проекта вашего вопроса, так как я только что пришел с рабочего места, где у нас было несколько проектов и несколько совместных проектов в подрывной деятельности.
Первое, что я хотел бы предложить, поскольку вы начинаете работать со следующей идеей: «Выполнение проверки ствола проекта в любом месте на жестком диске - это все, что требуется для создания раствор "
Также помните, что рабочие копии без изменений не имеют значения.Не имеет значения, где на диске вы проверяете вещи и удаляете рабочую копию, не следует начинать панику, так как вы можете просто проверить багажник снова и сразу начать работу. Я обнаружил, что в моих предыдущих местах много внимания уделяется «созданию» среды разработки и получению всего в нужном месте. Это абсурдно, и время, потраченное на это, никогда не возвращается. Сделайте это один раз, сделайте это в приличном контроле источника (например, svn, git или TFS) и будьте счастливы, что теперь вы можете работать с рабочими копиями, как вчерашняя газета.
Единственный раз, когда рабочая копия имеет какое-либо значение, есть ли какие-либо изменения, которые не были зафиксированы. Любая ценная рабочая копия уязвима. Всегда делайте изменения, если это возможно. Любая форма сбоя жесткого диска (в том числе повреждение рабочей копии), случайные удаления, изменения от чего-то, что работает на что-то, что нет, и т. Д., Может потерять значительную часть вашей работы - это ценный бит. Если ваш полупеченный код не подходит для просмотра в сундуке проекта, сделайте ветку и зафиксируйте это.
Это означает, что вы сможете проверять несколько версий одного и того же проекта в разных местах вашего накопителя и работать с ними (например, версии разработки и версии с поддержкой реального времени). Это также означает, что проверка внешней линии приведет к уменьшению всех зависимых библиотек под этой рабочей папкой.
Это также означает, что наличие определений уровня IDE, где расположены заголовки/библиотеки, просто не будет работать. Это была ужасная идея, которую представила визуальная студия, но они также позволяют вам указывать этот материал, используя относительные папки в отдельных настройках проекта - где это должно быть. Поверьте мне, если вы используете определения местоположения уровня IDE, в какой-то момент вы собираетесь создавать свое приложение и пытаться выяснить, почему ваши изменения не появляются. Тогда вы почувствуете это чувство опускания, когда осознаете, что только что создали свои последние 3 выпуска против старой, ошибочной версии библиотеки. По крайней мере, я это сделал.
Чтобы получить эту утопическую ситуацию, вам будет намного лучше, если вы рассмотрите каждый проект библиотеки & (например, CoolApp, CFoo, ThisControl, CWidget) в виде отдельных проектов с отдельными циклами выпуска, соединительными линиями и т. Д. Двигайтесь к мысли об этих вещах независимо, разрабатывая и выпуская их отдельно.
Это звучит как много накладных расходов, но если вы хотите внести изменения в общий компонент, не нарушая другие проекты, которые его используют, это необходимо.
Имея это в виду, я предлагаю вам структурировать хранилище что-то вроде этого:
/Projects
/CoolApp
/trunk
/branches
/tags
/Libraries
/CFoo
/trunk
/branches
/tags
/CWidget
/trunk
/branches
/tags
/ThisControl
/trunk
/branches
/tags
/Vendor
/NUnit
/current
/1.6
/1.7
Если хранилище не в настоящее время установки, как это, вы можете использовать svncopy структурировать ее. Вы можете использовать теги/соединительные линии/ветви на верхнем уровне и все под ним, но, на мой взгляд, это делает концептуальное разделение проектов более сложным.
Теперь проверяйте только багажник вашего основного проекта (CoolApp). Конечно - это не будет строиться так, как есть, потому что ни один из зависимых проектов не существует. Следующим шагом является добавление других проектов, таких как externals. В папке верхнего уровня вашей рабочей копии с помощью правого щелчка правой кнопкой мыши и перейдите в svn-> свойства. Добавьте новое свойство с именем «svn: externals».Определение свойств в формате
/repository_location[@revision] working_copy_folder
Так coolapp, вы можете добавить следующую SVN: определение Externals:
/Libraries/CFoo/trunk CFoo
/Libraries/CWidget/trunk CWidget
/Libraries/ThisControl/trunk ThisControl
Когда это будет сделано, фиксировать изменения, а затем сделать «Обновить» и ваши внешние также будут сбиты.
Вы можете создать любую структуру каталогов рабочей копии, которая вам нравится, используя эту форму определения внешних переменных. Вам придется изменить файл решения, чтобы искать проекты в новом месте, но это обычно не является большой проблемой.
Как только вы встаете и работаете таким образом, обратите внимание, что в целом очень плохая идея иметь внешние ссылки, указывающие на багажник. Это связано с тем, что, когда соединительная линия библиотеки изменяется из-за другого проекта, когда вы делаете новую проверку своего решения (или обновления), внезапно ваше идеальное решение не будет создано, даже если вы не думаете, что вы что-то изменили в нем. Начните создавать теги для своих библиотек и вместо этого укажите на них свои внешние. Это когда вы начинаете думать о своих библиотеках как о самостоятельных проектах.
Это ситуация для другого принципа: «Любые изменения в проект должны иметь соответствующий пересмотр в багажнике основного проекта» Изменения местоположения Externals, чтобы указать на новую версию библиотеки является прекрасным примером того, чтобы быть могу сказать: «Эй, теперь я использую версию 2 здесь. Проблема в предыдущем абзаце заключалась в том, что код изменился «снизу» вас.
Чтобы изменить библиотеку, в идеале вы должны проверить рабочую копию соединительной линии этой библиотеки, изменить ее и пометить ее новым номером версии. Затем в основном проекте измените внешний элемент на точку на новый тег и Update.
Вы можете сократить этот процесс, «переключив» местоположение вашей библиотеки с тега на багажник. Таким образом, когда вы совершаете фиксацию, вы передадите изменения библиотеки в магистраль. Однако, работая таким образом, вам нужно будет помнить, что внешний объект все еще указывает на тег - вам все равно нужно пометить свою библиотеку и изменить внешний проект, иначе новая проверка не будет создана.
Если вы полагаетесь на любые сторонние инструменты, такие как nAnt или nUnit, добавьте их в репозиторий в качестве ветвей поставщиков и обратитесь к ним через внешние ресурсы. VS позволяет вам ссылаться на dll, просматривая для них, что более гибко, чем от GAC. Возможно, это не похоже на проблему для одного разработчика, но если вы попытаетесь обновить nUnit по одному проекту за раз, вы увидите, насколько лучше он сможет проверить багаж вашего проекта и знать, что вы У вас есть правильная версия nUnit вместе с ней (вместо того, чтобы удалить nUnit и переустановить нужную версию).
Обратите внимание, что нет необходимости иметь каждый проект в вашем решении как отдельный внешний. Это только те вещи, которые могут или должны быть разделены между различными проектами, которые должны быть отделены.
Наконец, как только вы начнете работать, я бы предложил использовать механизм сборки, например CruiseControl.Net или Hudson (мой любимый). Это дает вам быстрый отзыв о любых проблемах, прежде чем они попадут под радар и укусят вас сзади.
Хорошо, я остановлюсь сейчас, я не собирался использовать значок «Самый длинный ответ».
Для получения дополнительной информации прочтите Eric Sink: http://www.ericsink.com/scm/source_control.html –
Благодарим вас за советы. Я сделаю свои библиотеки и классы отдельными проектами, как вы предложили. Однако я не могу понять, как правильно структурировать мой репозиторий. В настоящее время это что-то вроде следующего.
Я пробовал несколько вещей, чтобы поместить их в категории следующим образом, но я не могу заставить его работать. ??? – SynetechDoh! Форматирование, похоже, не работает для комментариев. – Synetech