Ошибка MSBuild Task на TFS 2018 из-за неправильного пути к SDK .net

У меня есть задача MSBuild по созданию проекта Service Fabric на TFS 2018 [On-Premises]. Решение отлично строится локально с использованием Visual Studio 2019 и MSBuild. Он не работает в агенте сборки TFS с ошибкой..

Ошибка NETSDK1045: текущий пакет SDK для.NET не поддерживает таргетинг на.NET Core 3.1. Либо целевой.NET Core 2.1 или ниже, либо используйте версию.NET SDK, поддерживающую.NET Core 3.1.

Я явно настроил задачу MSBuild на использование "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\msbuild.exe"

Я использую задачу MSBuild со следующими параметрами..

/p: Детерминированный =true /t: Пакет /p:PackageLocation=$(build.artifactstagingdirectory)\applicationpackage

В агенте сборки TFS установлены Visual Studio 2017 и 2019. Он также имеет установленный.Net core SDK 3.1. [Версия 3.1.100].

По какой-то причине выходные данные сборки показывают, что SDK загружается из "C:\Program Files\dotnet\sdk\2.1.602". Необходимо использовать SDK из "C:\Program Files\dotnet\sdk\3.1.100"

Как заставить задачу MSBuild использовать SDK из C:\Program Files\dotnet\sdk\3.1.100.

Я не могу добавить задачу "Установщик инструментов Nuget" в конвейер, поскольку наш агент сборки не имеет доступа к Интернету.

ПРИМЕЧАНИЕ. Проект отлично строился с использованием MSBuild из задачи сборки Visual Studio 2017 в TFS, когда мы работали с.net core 2.2.

Нам пришлось обновить один проект до.net core 3.1 и VS 2019, и это сломало сборку в TFS.

Содержание файла SFProj:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" InitialTargets=";ValidateMSBuildFiles">
  <Import Project="..\..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.7\build\Microsoft.VisualStudio.Azure.Fabric.Application.props" Condition="Exists('..\..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.7\build\Microsoft.VisualStudio.Azure.Fabric.Application.props')" />
  <PropertyGroup Label="Globals">
<ProjectGuid>3b02cfa3-a4c3-49ea-9186-64ae171d64a7</ProjectGuid>
<ProjectVersion>2.3</ProjectVersion>
<MinToolsVersion>1.5</MinToolsVersion>
<SupportedMSBuildNuGetPackageVersion>1.6.7</SupportedMSBuildNuGetPackageVersion>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
  </PropertyGroup>
  <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
  <Configuration>Debug</Configuration>
  <Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
  <Configuration>Release</Configuration>
  <Platform>x64</Platform>
</ProjectConfiguration>
 </ItemGroup>
  <ItemGroup>
<None Include="ApplicationParameters\Local.1Node.xml" />
<None Include="ApplicationParameters\Local.5Node.xml" />
<None Include="PublishProfiles\Local.1Node.xml" />
<None Include="PublishProfiles\Local.5Node.xml" />
<None Include="Scripts\Deploy-FabricApplication.ps1" />
  </ItemGroup>
  <ItemGroup>
<Content Include="ApplicationPackageRoot\ApplicationManifest.xml" />
<Content Include="ApplicationParameters\Params.xml" />
<Content Include="packages.config" />
  </ItemGroup>
 <ItemGroup>

<ProjectReference Include="..\Stateful1.csproj" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" />
<PropertyGroup>
<ApplicationProjectTargetsPath>$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Service Fabric Tools\Microsoft.VisualStudio.Azure.Fabric.ApplicationProject.targets</ApplicationProjectTargetsPath>
 </PropertyGroup>
<Import Project="$(ApplicationProjectTargetsPath)" Condition="Exists('$(ApplicationProjectTargetsPath)')" />
      <Import Project="..\..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.7\build\Microsoft.VisualStudio.Azure.Fabric.Application.targets" Condition="Exists('..\..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.7\build\Microsoft.VisualStudio.Azure.Fabric.Application.targets')" />
  <Target Name="ValidateMSBuildFiles" BeforeTargets="PrepareForBuild">
<Error Condition="!Exists('..\..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.7\build\Microsoft.VisualStudio.Azure.Fabric.Application.props')" Text="Unable to find the '..\..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.7\build\Microsoft.VisualStudio.Azure.Fabric.Application.props' file. Please restore the 'Microsoft.VisualStudio.Azure.Fabric.MSBuild' Nuget package." />
<Error Condition="!Exists('..\..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.7\build\Microsoft.VisualStudio.Azure.Fabric.Application.targets')" Text="Unable to find the '..\..\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.7\build\Microsoft.VisualStudio.Azure.Fabric.Application.targets' file. Please restore the 'Microsoft.VisualStudio.Azure.Fabric.MSBuild' Nuget package." />
  </Target>
</Project>

2 ответа

Решение

Мы выбрали выделенный пул dotnet с установленной только сборкой VS 2019. Теперь работает. Похоже, если у нас есть VS 2017 и VS 2019 на одной машине с агентом, он использует инструменты сборки VS 2017, вызывая сбой сборки VS 2019.

В агенте сборки TFS установлены Visual Studio 2017 и 2019. Он также имеет установленный.Net core SDK 3.1. [Версия 3.1.100].

По какой-то причине выходные данные сборки показывают, что SDK загружается из "C:\Program Files\dotnet\sdk\2.1.602". Необходимо использовать SDK из "C:\Program Files\dotnet\sdk\3.1.100"

Чтобы определить причину проблемы:

Добавьте задачу командной строки перед задачей msbuild, позвольте ей выполнитьdotnet --infoкоманда для вывода реальной версии sdk, используемой в вашей сборке. Проверьте, использует ли он версию 3.1.100.

(Как обычно, dotnet --info выведет доступную последнюю версию sdk)

Возможные обходные пути:

1.Для самого агента: Т.к. .net core SDK 3.1.100поддерживает VS2019 16.4 и выше. Поэтому попробуйте обновить VS2019 в агенте TFS до последней версии и щелкните правой кнопкой мыши.net core project в VS, чтобы проверить, доступен ли 3.1 в раскрывающемся списке:

Иногда вам может потребоваться переустановить или отремонтировать SDK.net core 3.1.100.

2. Для сборки: вы можете добавить основную задачу use .net перед другими задачами в сборке.

Укажите эту задачу, чтобы использовать 3.1.100 версия, а затем последующие задачи (задача MSBuild) также будут использовать эту версию.

Примечание:Use .net core taskзагрузка и установка указанного.net core sdk займет несколько минут. Поэтому рекомендуется настраивать sdk вручную в локальном агенте. Надеюсь, это поможет:)

Другие вопросы по тегам