PackageReference Разрешить версию логики как API

Существует ли какой-либо доступный API через задачу MSBuild, цель или иным образом, который позволяет мне запрашивать, к какой версии пакета NuGet будет разрешена (или уже разрешена) данная PackageReference?

Например, если у меня есть csproj с

<PackageReference Include=“MyPkg” Version=“1.*”/>

И у меня есть особая цель, где я хочу

<MyTarget>
  <GetVersionOfResolvedPackageReference Name=“MyPkg” OutputProperty=“IWantToKnowThis” /> <!— or something —>
  ...

1 ответ

Решение

Из того, как NuGet разрешает зависимости пакетов:

Когда процесс восстановления NuGet запускается до сборки, он сначала разрешает зависимости в памяти, а затем записывает полученный граф в файл с именем project.assets.json в папке obj проекта, используя PackageReference. Затем MSBuild читает этот файл и переводит его в набор папок, в которых можно найти потенциальные ссылки, а затем добавляет их в дерево проекта в памяти.


<#
.Synopsis
    Represents the method that
    returns the project.assets
    content as object.
#>
function Get-ProjectAssest([System.String]$Assest) {

    return (Get-Content $Assest | ConvertTo-Json | ConvertFrom-Json).value |
                                                   ConvertFrom-Json
}

Get-ChildItem -Path . 'project.assets.json' -Recurse | ForEach-Object { Get-ProjectAssest($_.FullName) } | ForEach-Object {

    # K = Package Identity
    # V = Package Version
    $_.libraries | ForEach-Object { $_.PSObject.Properties.Name } | Out-File 'PackageReference.ini' -Append 
}

это PowerShell скрипт рекурсивно разбирает каталоги, чтобы найти project.assets.json и пишет результат в PackageReference.ini файл. Вы можете вызвать скрипт из MSBuild через задачу Exec и после этого прочитать файл через ReadLinesFromFile и выполнить дальнейшую обработку.


ПРИМЕЧАНИЕ. Представленный скрипт будет создавать дубликаты PackageReference линии для нескольких проектов.

Другие вопросы по тегам