Обнаружить Target Framework / Ошибка несовместимости DLL NuGet во время сборки - PullRequest
0 голосов
/ 06 февраля 2020

Есть ли способ заставить NuGet / MSBuild сообщать об ошибке несовместимости эталонного целевого фреймворка .csproj пакета / пакета NuGet во время сборки?

Рассмотреть приложение с двумя ветвями:

  • Ветвь магистрали - цели. NET Framework 4.8
  • Ветвь обслуживания - цели. NET Framework 4.5.2.

Рассмотрим пакет NuGet (PackageX), который является целенаправленный. Он нацелен на netstandard2.0 и netstandard1.1. Поскольку пакет NuGet является многоцелевым, он будет иметь следующие папки lib:

  • \ packages \ PackageX \ lib \ netstandard1.1 \
  • \ packages \ PackageX \ lib \ netstandard2.0 \

Если разработчик добавляет ссылку на PackageX в ветви Trunk, предназначенной для. NET Framework 4.8, файл .csproj будет ссылаться на PackageX.dll в каталоге \ packages \ PackageX \ Lib \ netstandard2.0 \.

Если разработчик перенес свои изменения из ветви Trunk в ветку Maintenance, ссылка .csproj на PackageX.dll в папке \ packages \ PackageX \ lib \ netstandard2.0 \ получает обратно. Однако это неверный путь для кода ветви обслуживания . Поскольку код ветви обслуживания предназначен для. NET Framework 4.5.2, правильная ссылка на DLL должна быть \ packages \ PackageX \ lib \ netstandard1.1 \.

Разработчик почти наверняка не узнает о проблеме ссылки на путь к NuGet DLL, упомянутой выше, когда он обратит свои изменения. .Csproj собирается без каких-либо ошибок или предупреждений об этой проблеме. Проблема не будет обнаружена до тех пор, пока код ветви обслуживания не будет развернут на сервере QA, на котором не установлено ни одного. NET версии Framework> 4.5.2. Ошибка, о которой будет сообщено:

FileNotFoundException - Could not load file or assembly 'netstandard, Version=2.0.0.0...

Это кажется , как будто должен быть какой-то способ обнаружения этой версии целевой платформы .csproj / проблемы ссылки NuGet lib DLL как части сборки обработать. Кто-нибудь знает какие-либо хитрости, которые можно предпринять, чтобы обнаружить и сообщить об этой проблеме?

1 Ответ

0 голосов
/ 07 февраля 2020

Похоже, должен быть какой-то способ обнаружения этой целевой версии .csproj Framework / проблемы ссылки NuGet lib DLL в процессе сборки. Кто-нибудь знает какие-либо хитрости, которые можно предпринять, чтобы обнаружить и сообщить об этой проблеме?

Насколько я знаю, сама задача msbuild не содержала такой функции для обнаружения несовместимости между nuget dll и структурой проекта версия. Процесс сборки предназначен только для обнаружения любых ошибок в скомпилированном файле, таких как синтаксис.

В качестве обходного пути вы можете добавить собственную цель, чтобы вручную определять опорную версию nuget Dll и версию фреймворка проекта.

Первый , добавьте это под dll nuget, которую вы хотите обнаружить:

<Reference Include="Microsoft.Extensions.Primitives, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
      <HintPath>...\xxxx\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll</HintPath>
      <EMA>%(Reference.HintPath)</EMA>
    </Reference>

Second , напишите пользовательскую цель сборки, чтобы сообщить dll nuget и версию фреймворка проекта.

<Target Name="Dected" AfterTargets="Build">
    <Message Importance="high" Text="the Nuget DLL Path is----%(Reference.EMA)----------------the project framework is $(TargetFrameworkVersion)">
    </Message>
  </Target>

Обновление 1

enter image description here

И Вы можете увидеть эту информацию в журнале msbuild или Окно вывода в VS, которое поможет вам определить, совместимы ли они.

Обратите внимание, что когда вы переносите проект на QA Server, который поддерживает framework <=4.5.2, вы должны понизить версию фреймворка вашего проекта <=4.5.2 ,

Кроме того, , для решения проблемы можно попробовать восстановить nuget в QA Server. Если у вас есть инструмент для сборки, попробуйте сначала msbuild -t:store first командную строку.

...