Поделиться через


Предупреждение NuGet NU5128

Сценарий 1

Некоторые целевые платформы, объявленные в группе зависимостей nuspec и папке lib/ref, не имеют точных совпадений в другом расположении. Ознакомьтесь со списком действий ниже.

  • Добавьте группу зависимостей для . NETStandard2.0 в nuspec

Проблема

ref/<tfm>/ Каталог lib/<tfm>/ в пакете содержит по крайней мере один файл для Moniker Целевой платформы (TFM), указанный в сообщении предупреждения. Однако для этого TFM в nuspec файле не существует группы зависимостей. Это может привести к тому, что потребители пакетов считают, что пакет несовместим с TFM, даже если пакет не имеет зависимостей. Если пакет имеет необъявленные зависимости, проект, использующий пакет, будет испытывать ошибки среды выполнения.

Решение

  • Запуск целевого объекта пакета NuGet в проекте

По возможности используйте целевой объект пакета MSBuild NuGet, так как он автоматически сопоставляет сборки TFM с группами зависимостей из целевых платформ проекта. Обратите внимание, что проект должен использовать PackageReference для собственных зависимостей NuGet. Если в проекте используется packages.config, необходимо использовать nuget.exe pack и nuspec файл.

  • Измененный nuspec вручную файл

Если вы используете пользовательский nuspec файл, рекомендуется использовать каждый TFM, для которого lib/ или ref/ сборки существуют, должны иметь соответствующую группу зависимостей, даже если зависимости совпадают со следующим совместимым TFM. Например, если пакет содержит netstandard1.0 и netstandard2.0 сборки, а зависимости одинаковы для обоих, рекомендуется указывать оба TFM в качестве групп зависимостей с повторяющимися элементами зависимостей.

Обратите внимание, что идентификатор TFM, используемый в путях сборки, использует другой формат идентификатора TFM, используемого в группах зависимостей. Предупреждение указывает правильное имя, используемое в группе зависимостей. Если пакет не имеет зависимостей для этой целевой платформы, используйте пустую группу. Например:

<package>
  <metadata>
    ...
    <dependencies>
      <group targetFramework=".NETFramework4.7.2" />
    </dependencies>
  </metadata>
  ...
</package>
  • lib/ Удаление или ref/ файлы

Если вы не хотите, чтобы ваш пакет был совместим с сообщаемой платформой TFM, измените проект таким образом, что нет lib/<tfm>/ или ref/<tfm>/ файлы находятся в пакете для этого TFM. Например, если предупреждение добавляет в пакет группу .NETFramework4.7.2 nuspecзависимостей, удалите все lib/net472/* ref/net472/* и файлы из пакета.

Сценарий 2

Некоторые целевые платформы, объявленные в группе зависимостей nuspec и папке lib/ref, не имеют точных совпадений в другом расположении. Ознакомьтесь со списком действий ниже.

  • Добавление сборок lib или ref для целевой платформы netstandard2.0

Проблема

Файл nuspec имеет группу зависимостей для указанного Moniker Целевой платформы (TFM), но для этого TFM не существуют сборки либо lib/ ref/. Если есть сборки для совместимого TFM, пакет по-прежнему установится, но зависимости могут быть неверными для сборок, используемых во время компиляции, и может привести к сбою проекта во время выполнения.

Решение

  • Запуск целевого объекта пакета NuGet в проекте

По возможности используйте целевой объект пакета MSBuild NuGet, так как он автоматически сопоставляет сборки TFM с группами зависимостей из целевых платформ проекта. Обратите внимание, что проект должен использовать PackageReference для собственных зависимостей NuGet. Если в проекте используется packages.config, необходимо использовать nuget.exe pack и nuspec файл.

  • Редактирование nuspec файла вручную

Добавьте сообщаемый TFM в качестве дополнительной целевой платформы, для которой выполняется компиляция проекта, и добавьте сборки в пакет. Если вы используете проект стиля пакета SDK для нескольких целевых TFM, целевые объекты пакета NUGet MSBuild могут автоматически добавлять сборки в правильную lib/<tfm>/ папку и создавать группы зависимостей с правильными TFM и зависимостями. Если вы используете проект стилей, отличный от пакета SDK, скорее всего, потребуется создать дополнительный файл проекта для дополнительного TFM и изменить nuspec файл, чтобы скопировать выходные сборки в правильном расположении пакета.

  • Добавление пустого _._ файла

Если пакет не содержит сборок, таких как метапакет, рассмотрите возможность добавления пустого _._ файла в lib/<tfm>/ каталоги для TFMs, перечисленных в сообщении предупреждения. Например, если предупреждение сообщает о добавлении сборок для целевой netstandard2.0 платформы, создайте пустой lib/netstandard2.0/_._ файл в пакете.

  • Удаление группы зависимостей

Если вы используете пользовательский nuspec файл, удалите группу зависимостей для сообщаемого TFM, оставив только группы зависимостей для TFMs, для которых lib/<tfm>/ существуют или ref/<tfm>/ файлы.

  • Удалите все зависимости для пакетов, которые не связаны с сборками

Если пакет не содержит никаких lib/ или ref/ файлов и не является метапакетом, скорее всего, не имеет зависимостей, необходимых потребителю пакета. Если вы упаковываете целевой объект пакета MSBuild NuGet, вы можете задать <SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking> любой PropertyGroup из файлов проекта. Если вы используете пользовательский nuspec файл, удалите <dependencies> элемент.

  • Другие сценарии

Это предупреждение было добавлено во время разработки NuGet 5.3 и впервые было доступно в пакете SDK для .NET Core 3.0 ( предварительная версия 9). NuGet/Home#8583 отслеживает проблему, из-за которой предупреждение было создано в слишком многих сценариях. Свойство MSBuild можно использовать (добавить <NoWarn>$(NoWarn);NU5128</NoWarn> в любой NoWarn PropertyGroup файл проекта). При наличии нескольких затронутых проектов можно использовать Directory.Build.targets для автоматического добавления NoWarn во все проекты.