Критические изменения MSBuild в .NET Core 2.1–3.1

На этой странице описаны следующие критические изменения:

Критическое изменение Представленные версии
Сборки времени разработки возвращают только ссылки на пакеты верхнего уровня 3.1
Изменение имен файлов манифеста ресурса 3.0
Средства проекта теперь включены в пакет SDK 2.1

.NET Core 3.1.

Сборки времени разработки возвращают только ссылки на пакеты верхнего уровня

Начиная с пакета SDK для .NET Core 3.1.400 целевой RunResolvePackageDependencies возвращает только ссылки на пакеты верхнего уровня.

Представленные версии

Пакет SDK для .NET Core 3.1.400

Описание изменения

В предыдущих версиях пакета SDK для .NET Core целевой объект RunResolvePackageDependencies создавал следующие элементы MSBuild, которые содержали информацию из файла ресурсов NuGet:

  • PackageDefinitions
  • PackageDependencies
  • TargetDefinitions
  • FileDefinitions
  • FileDependencies

Эти данные используются в Visual Studio для заполнения узла зависимостей в обозревателе решений. Однако объем данных может быть большим, и эти данные не нужны, если узел зависимости не развернут.

Начиная с пакета SDK для .NET Core версии 3.1.400 большинство этих элементов не создается по умолчанию. Возвращаются только элементы типа Package. Если Visual Studio требуются элементы для заполнения узла зависимостей, он считывает информацию непосредственно из файла ресурсов.

Причина изменения

Это было введено для улучшения производительности при загрузке решения в Visual Studio. Ранее загружались все ссылки на пакеты, что приводило к загрузке множества ссылок, которые большинство пользователей никогда не увидят.

Если логика MSBuild зависит от создаваемых элементов, задайте для свойства EmitLegacyAssetsFileItems в файле проекта значение true. Этот параметр включает предыдущее поведение, при котором создаются все элементы.

Категория

MSBuild

Затронутые API

Н/П


.NET Core 3.0

Изменение имени файла манифеста для ресурса

Начиная с .NET Core 3.0, в стандартных ситуациях MSBuild создает другие имена файлов манифеста для файлов ресурсов.

Представленные версии

3.0

Описание изменения

До версии .NET Core 3.0, если для элемента EmbeddedResource в файле проекта не были указаны метаданные LogicalName, ManifestResourceNameили DependentUpon, платформа MSBuild создавала имя файла манифеста в формате <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources. Если в файле проекта не определено значение RootNamespace, по умолчанию используется имя проекта. Например, для файла ресурсов с именем Form1.resx в корневом каталоге проекта создавался манифест с именем MyProject.Form1.resources.

Начиная с версии .NET Core 3.0, при размещении файла ресурса в одной папке с одноименным исходным файлом, (Form1.resx и Form1.cs), MSBuild использует сведения о типе из исходного файла для создания имени файла манифеста в формате <Namespace>.<ClassName>.resources. Пространство имен и имя класса извлекаются из первого типа в исходном файле, найденном в той же папке. Например, для файла ресурсов с именем Form1.resx, который расположен в одной папке с исходным файлом Form1.cs, создается манифест с именем MyNamespace.Form1.resources. Важно отметить, что первая часть имени файла отличается от имени в прежних версиях .NET Core (MyNamespace вместо MyProject).

Примечание.

Если для элемента EmbeddedResource в файле проекта указаны метаданные LogicalName, ManifestResourceName или DependentUpon, это изменение не применяется к соответствующему файлу ресурсов.

Это критическое изменение было введено одновременно с добавлением свойства EmbeddedResourceUseDependentUponConvention для проектов .NET Core. По умолчанию файлы ресурсов не указаны явным образом в файле проекта .NET Core, поэтому в них нет метаданных DependentUpon, которые позволяют задать формат именования созданного файла .resources. Если EmbeddedResourceUseDependentUponConvention имеет значение true (используется по умолчанию), MSBuild ищет в той же папке исходный файл и извлекает из этого файла пространство имен и имя класса. Если для EmbeddedResourceUseDependentUponConvention задано значение false, MSBuild создает имя манифеста по правилам для прежних версий, то есть объединяет RootNamespace и относительный путь к файлу.

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

  • Измените код так, чтобы он ожидал новое имя манифеста.

  • Откажитесь от нового соглашения об именовании, указав в файле проекта параметр EmbeddedResourceUseDependentUponConvention со значением false.

    <PropertyGroup>
      <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
    </PropertyGroup>
    

Категория

MSBuild

Затронутые API

Н/П


.NET Core 2.1

Средства проекта теперь включены в пакет SDK

Пакет SDK для .NET Core 2.1 теперь включает общие средства CLI, и больше не нужно включать в проект ссылки на эти средства.

Описание изменения

В .NET Core 2.0 проекты ссылаются на внешние инструменты .NET с помощью параметра проекта <DotNetCliToolReference>. В .NET Core 2.1 некоторые из этих средств включены в пакет SDK для .NET Core, и этот параметр больше не требуется. Если включить в проект ссылки на эти средства, появится сообщение об ошибке следующего вида: Средство "Microsoft.EntityFrameworkCore.Tools.DotNet" теперь включено в пакет SDK для .NET Core.

Средства, которые теперь входят в пакет SDK для .NET Core 2.1:

<Значение DotNetCliToolReference> Средство
Microsoft.DotNet.Watcher.Tools dotnet-watch
Microsoft.Extensions.SecretManager.Tools dotnet-user-secrets
Microsoft.Extensions.Caching.SqlConfig.Tools dotnet-sql-cache
Microsoft.EntityFrameworkCore.Tools.DotNet dotnet-ef

Представленные версии

Пакет SDK для .NET Core 2.1.300

Удалите параметр <DotNetCliToolReference> из проекта.

Категория

MSBuild

Затронутые API

Н/Д