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


PackageDownload

Начиная с Visual Studio 2017 и .NET SDK 1.0.0 добавлена функция NuGet PackageReference.

PackageReference позволяет управлять зависимостями пакета непосредственно в файле проекта. При выполнении операции восстановления транзитивные зависимости разрешаются автоматически, а соответствующие ссылки выбираются для каждого пакета в графе проекта.

В NuGet версии 5.3 для проектов в стиле пакета SDK для .NET была представлена вспомогательная функция PackageDownload. Она позволяет скачать пакет, не включая его файлы в проект.

Спецификация PackageDownload

PackageDownload — это служебная функция для всех проектов в стиле пакета SDK для .NET, которая работает вместе с PackageReference.

Элементы PackageDownload поддерживают атрибуты, отличные от атрибутов PackageReference. Поддерживаются только атрибуты, перечисленные в таблице ниже.

Атрибуты Description Пример
Версия Поддерживаются только точные версии в []. Несколько версий можно указать с разделителем ; [1.0.0], [1.0.0];[2.0.0]

Пакеты, полученные через PackageDownload, проходят тот же процесс установки, что и пакеты, полученные через PackageReference. Это означает, что проверяются подписи пакета и учитывается сопоставление источника пакета. Все вновь приобретенные пакеты PackageDownload будут установлены в папку глобальных пакетов.

Функция PackageReference PackageDownload
Выбор ресурсов пакета Сборки из пакетов автоматически добавляются в проект и могут использоваться для компиляции и среды выполнения В проект не включаются ресурсы из пакета
Зависимости Автоматически разрешаются и сводятся в одну версию Не учитываются
пакет… Включено в спецификацию пакета Не включено в спецификацию пакета
Транзитивность Элементы PackageReference автоматически распространяются на зависимые проекты Элементы PackageDownload игнорируются зависимыми проектами
Версия Поддерживаются диапазоны версий, такие как 1.0.0 или [1.0.0, ). Допускается только одна версия. Поддерживаются только точные версии. Можно скачать более одной версии.
dotnet list package Все зависимости включены Пакеты PackageDownload не отображаются в dotnet list package.

Из-за того, что PackageDownload не привязан к проекту, можно загрузить несколько версий одного пакета.

Ограничения PackageDownload

Учитывая, что это расширенная функция с ограниченной применимостью, она не обеспечивает такую же поддержку инструментов, как PackageReference.

  • Не существует функциональных возможностей VisualStudio и dotnet.exe для изменения элементов PackageDownload. Их можно изменять только вручную в файлах проекта.
  • Команды DotNet Add, Remove и List не учитывают элементы PackageDownload.
  • Элементы PackageDownload не входят в файл блокировки пакетов.

Применения PackageDownload

Основное применение PackageDownload — загрузка пакетов, которые не соответствуют традиционной структуре пакета NuGet и, в основном, содержат зависимости времени сборки.

В идеале все зависимости выражаются через PackageReference, но если это невозможно или непрактично, эту функцию можно использовать для загрузки (download) пакетов в определенное расположение, так же, как это можно сделать с помощью файла packages.config, не привязанного к проекту.

Пример:


<Project Sdk="Microsoft.Build.NoTargets/1.0.80"> <!-- This is not a project we want to build. -->

    <PropertyGroup>
        <RestorePackagesPath>packages/</RestorePackagesPath> <!-- Changes the global packages folder-->
        <MSBuildProjectExtensionsPath>$(RestorePackagesPath)obj/</MSBuildProjectExtensionsPath> <!-- It's still PackageReference, so project intermediates are still created. -->
        <TargetFramework>net5.0</TargetFramework> <!-- This is not super relevant, as long as your SDK version supports it. -->
        <DisableImplicitNuGetFallbackFolder>true</DisableImplicitNuGetFallbackFolder> <!-- If a package is resolved to a fallback folder, it may not be downloaded.-->
        <AutomaticallyUseReferenceAssemblyPackages>false</AutomaticallyUseReferenceAssemblyPackages> <!-- We don't want to build this project, so we do not need the reference assemblies for the framework we chose.-->
    </PropertyGroup>

    <ItemGroup>
        <PackageDownload Include="MySpecialPackage" version="[6.0.0]" />
    </ItemGroup>

</Project>