MSBuild в решении TeamCity для Visual Studio 2012

У меня есть веб-проект VS 2012/sln, который я пытаюсь создать в TeamCity. он использует .NET 4.5, который установлен на TeamCity.

Сервер TeamCity имеет VS 2010 только.

Я получаю эту ошибку при запуске сборки:

C:\BuildAgent\work\d5bc4e1b8005d077\CUSAAdmin.Web\CUSAAdmin.Web.csproj(799, 3): 
error MSB4019: 
The imported project 
    "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets" was not found. 
 Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. Project CUSAAdmin.Web\CUSAAdmin.Web.csproj failed. 
 Project CUSAAdmin.sln failed. 

Он пытается использовать Visual Studio 2012 (v11.0) для сборки.

Я установил VisualStudioVersion 10 в build.xml, хотя

 <Target Name="BuildPackage">
   <MSBuild Projects="CUSAAdmin.sln" ContinueOnError="false" 
     Targets="Rebuild" 
      Properties="Configuration=$(Configuration); VisualStudioVersion=10.0"  />

Как и внутри проекта, он по умолчанию выполняет VS2010

  <PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath 
    Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

Ответ 1

На самом деле вам не нужно устанавливать Visual Studio на ваш сервер CI. Вам нужно всего лишь скопировать несколько папок с машины разработки в одно и то же место на сервере CI.

VS 2015:

  • C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web
  • C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\WebApplications

VS 2013:

  • C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Web
  • C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\WebApplications

VS 2012:

  • C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web
  • C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications

VS 2010:

  • C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web
  • C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications

.NET 4.6:

  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework \.NETFramework\v4.6

.NET 4.5.2:

  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework \.NETFramework\v4.5.2

.NET 4.5.1:

  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework \.NETFramework\v4.5.1

.NET 4.5:

  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework \.NETFramework\v4.5

.NET 4.0.1:

  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework \.NETFramework\v4.0.1

.NET 4.0:

  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework \.NETFramework\v4.0

Или, как Мэтт предложил, вы можете скопировать их в подкаталог вашего проекта и изменить расположение <MSBuildExtensionsPath32> в своем MSBuild (обычно .csproj или .vbproj).

Как только вы это сделаете, ваш проект будет скомпилирован. Вы все равно должны явно установить VisualStudioVersion на тот, который используете, чтобы убедиться, что он установлен правильно.

ПРИМЕЧАНИЕ.. Это решение работает для всех типов проектов (включая веб-проекты). Для веб-сайта (у которого нет файла проекта) я закончил установку Windows SDK, соответствующую используемой версии .NET SDK, потому что там были лишены ключей реестра, которые заставляли его не строить.

Ответ 2

Оказывается, это очень просто. Чтобы заставить MSBuild запустить VS2010 в качестве разработчика для решения, созданного VS2012 в TeamCity, просто установите переменную среды для конфигурации сборки следующим образом:

enter image description here

Name: env.VisualStudioVersion 
Value: 10.0

Примечание. TeamCity не требует установки VS2012.

Ответ 3

В качестве альтернативы вы можете скопировать целевые объекты сборки из c:\Program Files (x86)\MSBuild в подкаталог вашего проекта (например.\Build), чтобы сохранить структуру и добавить к вашему csproj следующее:

<!-- redirect msbuild path so targets can be added to source control -->
<PropertyGroup>
  <MSBuildExtensionsPath32>..\Build\</MSBuildExtensionsPath32>
</PropertyGroup>

Например, если моим корнем проекта является C:\Dev\MyProjSln\MyProj

  • Создать папку C:\Dev\MyProjSln\Build\Microsoft\VisualStudio\version\WebApplications\
  • Копировать содержимое C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\version > \WebApplications\в созданную папку
  • Добавить элемент MSBuildExtensionsPath32 в группу свойств в Project node в csproj
  • Profit!

Лично я предпочитаю этот метод отслеживания зависимостей сборки, поскольку он не позволяет серверу сборки зависать от недокументированных требований к структуре папок и получает ваши зависимости в исходное управление

Ответ 4

Как описано здесь:

  • Установить nuget MSBuild.Microsoft.VisualStudio.Web.targets
  • Отредактируйте файл .csproj

Заменить:

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> 
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />

с:

<Import Project="..\packages\MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1\tools\VSToolsPath\WebApplications\Microsoft.WebApplication.targets" Condition="true" />

Очевидно, что вы должны убедиться, что версии соответствуют вашему случаю как на установленном nuget, так и на пути в <Import>

Ответ 5

Я полностью не согласен с изменением файлов проекта, поскольку это может повлиять на других разработчиков. Это то, что сработало для меня, так как папка v11.0 отсутствовала в папке MS build: 1) Создать v111.

  • Создать папку v11.0 на C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio
  • Скопируйте папки Web и WebApplications из моего окна разработки "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0"
  • Booom! работа как шарм \
  • Примечание. Я установил "Распространяемый пакет Microsoft Visual Studio 2012 (изолированный)"

Ответ 6

Во-первых, TeamCity не требует наличия Visual Studio любой версии для сборки. Когда шаг сборки в проекте сконфигурирован с помощью бегуна MSBuild, TeamCity должен знать, какую версию MSBuild использовать. Это настройка шага сборки. Правильная версия MSBuild должна быть выбрана в конфигурации шага сборки в соответствии с инструментами .NET, установленными на машине сборки. TeamCity будет использовать это значение для определения пути местоположения и будет устанавливать переменную среды при вызове MSBuild.

Проблема с Visual Studio 2012/2013 заключается в том, что она поддерживается только TeamCity начиная с 8.1.0. Поэтому, если ваша версия TeamCity до 8.1. вам нужно обновиться до последней версии 8.1.x, чтобы увидеть настройки для MSBuild Tools 2013. После выбора правильной версии MSBuild в настройках шага сборки проблема исчезнет. Для получения дополнительной информации читайте здесь: http://blog.turlov.com/2014/07/upgrade-teamcity-to-enable-support-for.html