PackageReference将版本逻辑解析为API

时间:2018-08-08 17:47:02

标签: msbuild nuget csproj msbuild-15 packagereference

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

例如,如果我有一个csproj与

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

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

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

1 个答案:

答案 0 :(得分:1)

来自How NuGet resolves package dependencies

  

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


  

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