В последнее время занимаюсь переносом проектов на новый билд сервер, и поэтому столкнулся с некоторыми проблемами. Одна из них в заголовке. Она возникает при компиляции веб проектов. Если открыть файл проекта *.csproj, то увидите следующую строчку:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
А причина этой ошибки в том что в каталоге
- 32-bit Windows
\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\
- 64-bit Windows
\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\
отсутствуют два файла: Microsoft.WebApplication.Build.Tasks.Dll и Microsoft.WebApplication.targets
Такое бывает если на билд сервере не установлена Visual Studio. Устанавливать ее ради этих файлов не очень хорошая идея. Можно сделать проще вручную скопировать их в этот каталог. Но есть способ хитрее, перетащить эти файлы к себе в исходники и подгружать их в случае отсутствия оных в положенном месте.
Элемент Import допускает использование условия. Воспользуемся этим. Открываем файл проекта в текстовом редакторе и добавляем условие к элементу Import:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets"
Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets')" />
Теперь если первый импорт не сработал нужен план Б. Сделаем импорт ранее заготовленного файла.
<Import Project="ОТНОСИТЕЛЬНЫЙ_ПУТЬ_К_ФАЙЛУ\Microsoft.WebApplication.targets"
Condition="!Exists(‘$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets’)" />
Резонно возникает вопрос – Почему нельзя сразу сделать импорт из своей директории, и обойтись одним импортом без условий?
Ответ – Потому что при открытии проекта в Visual Studio, он предложит сконвертировать проект.