MSBuild .props и .targets в пакете

В дополнение к более традиционным сборкам пакеты NuGet иногда могут добавлять пользовательские целевые объекты сборки или свойства в проекты, использующие этот пакет. Это можно сделать, добавив допустимый MSBuild-файл в виде <package_id>.targets или <package_id>.props (например Contoso.Utility.UsefulStuff.targets) в папки сборки проекта.

Создание папок

По мере развития NuGet различные папки для сборки .props и .targets добавлены.

Folder Версия NuGet Использование
строить 2.5+ Построение логики для каждого фреймворка проекта.
buildMultiTargeting 4.0+ Логика разработки outer build для проектов, ориентированных на несколько фреймворков. Только PackageReference.
buildTransitive 5.0+ Построение логики для активов, которые передаются транзитивно в любой задействованный проект. См. об этой функции. Только PackageReference.

Конкретная папка сборки платформы

Все 3 папки сборки соответствуют одному и тому же шаблону для выбора наиболее подходящего файла на основе целевой платформы проекта.

Файлы в корневой папке сборки build/<package_id>.targets и build/<package_id>.props считаются подходящими для всех целевых фреймворков.

Чтобы предоставить файлы, относящиеся к платформе, сначала следует разместить их в соответствующих вложенных папках, например в следующих случаях:

    \build
        \netstandard1.4
            \Contoso.Utility.UsefulStuff.props
            \Contoso.Utility.UsefulStuff.targets
        \net462
            \Contoso.Utility.UsefulStuff.props
            \Contoso.Utility.UsefulStuff.targets

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

Обратите внимание, что если пакет не содержит файлов в папках lib или ref, а имеет только файлы в конкретной папке сборки платформы, этот пакет будет считаться совместимым со всеми проектами. Актуальные версии инструментов пакета вызывают предупреждение NU5127 при создании таких пакетов.

Проекты, потребляющие пакеты с файлами сборки

Проекты PackageReference

.props и .targets не добавляются в файл проекта, но вместо этого становятся доступными через {projectName}.nuget.g.targets и {projectName}.nuget.g.props. Эти файлы создаются автоматически при выполнении восстановления.

Если проект предназначен для нескольких платформ, импорт в эти файлы зависит от имени целевой платформы.

MSBuild .props и .targets файлы для многоплатформенных целевых объектов можно поместить в папку \buildMultiTargeting . При создании импорта устанавливается условие, что свойство MSBuild $(TargetFramework) пусто.

проекты packages.config

Когда NuGet устанавливает пакет с файлами \build, он добавляет в файл проекта элементы MSBuild <Import>, указывающие на файлы .targets и .props. (.props добавляется в верхней части файла проекта; .targets добавляется в нижней части.) Для каждой целевой платформы добавляется отдельный условный элемент MSBuild <Import> .

Разработка пакетов с помощью свойств и целей MSBuild

Вы можете использовать любой из следующих средств, чтобы включить MSBuild .props и .targets в пакет.

Руководство по содержанию свойств и целевых задач MSBuild

NuGet не ограничивает, как вы можете разрабатывать .props и .targets, так как это будет зависеть от необходимости автора пакета и самих целевых проектов.

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

  • Некоторые примеры свойств, которые не должны быть добавлены или обновлены: TargetFramework, TargetFrameworkMoniker, TargetPlatformMoniker, AssetTargetFallback и т. д.

  • Некоторые примеры элементов, которые не должны быть добавлены или обновлены: PackageReference, PackageVersion, PackageDownload и т. д.