Одна из вещей, на которые следует обращать внимание в любой системе сборки, - это убедиться, что она знает обо всех зависимостях. В вашем случае вы смешиваете системы сборки, и это нормально, но вы должны убедиться, что и Nant, и MSBuild знают ваши зависимости. Если у вас есть два взаимозависимых решения, может быть полезно переместить эти зависимые проекты в собственное решение, чтобы гарантировать, что они собираются только один раз в течение цикла сборки.
Убедитесь, что вы используете инкрементную компиляцию. Если вы не доверяете инкрементным сборкам для кандидатов на выпуск, используйте отдельные цели сборки для выпусков и тестов и сборок разработки. Также убедитесь, что вы используете соответствующие настройки компилятора для типа выполняемой сборки.
Любые решения, которые не имеют зависимостей времени компиляции друг от друга, могут быть построены параллельно. В то время как MSBuild (3.5 и более поздние версии) изначально поддерживает параллельные сборки на одной и той же машине, Nant не поддерживает (однако его аналог Java, Ant делает). Один из способов компенсировать это - создать основной файл решения, который используется только при сборке. Это позволило бы MSBuild распараллеливать независимые проекты. В этой слегка устаревшей статье MSDN перечислены преимущества и недостатки различных методов организации решений / проектов. Вы можете перейти на следующий уровень, настроив сборочную ферму и создав независимые решения на нескольких компьютерах. Большинство серверов непрерывной интеграции поддерживают это.
Еще одна вещь, которую стоит рассмотреть, - следуют ли ваши проекты принципу СУХО в нескольких проектах разработки. Если два несвязанных проекта имеют классы с похожими целями, их можно объединить в один класс и перенести в общую библиотеку. Удаляя дублирование кода, вы не только снижаете затраты на обслуживание, но и оптимизируете процесс сборки. Поиск дубликатов в несвязанных проектах занимает много времени, если ваши разработчики специализируются на определенных проектах.