1

是否有任何可通过 MSBuild 任务、目标或其他方式访问的 API,允许我查询给定 PackageReference 将解析(或已经解析)到哪个版本的 NuGet 包?

例如,如果我有一个 csproj

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

我有一个我想要的自定义目标

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

1 回答 1

1

NuGet 如何解决包依赖项

当 NuGet 还原过程在构建之前运行时,它首先在内存中解析依赖关系,然后使用 PackageReference 将生成的图形写入项目的 obj 文件夹中名为 project.assets.json 的文件。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文件。您可以通过Exec任务从 MSBuild 调用脚本,然后通过ReadLinesFromFile读取文件并执行进一步处理。


注意:表示的脚本将为多个项目生成重复的PackageReference行。

于 2018-08-12T16:03:29.593 回答