MSBuild — error MSB4057: The target PipelineTransformPhase does not exist in the project

В последнее время занимаюсь переносом проектов на новый билд сервер, и поэтому столкнулся с некоторыми проблемами. Одна из них в заголовке. Она возникает при компиляции веб проектов. Если открыть файл проекта *.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, он предложит сконвертировать проект.