获取解决方案中使用的所有NuGet包的列表



我正在寻找一种方法,使用命令行脚本而不是在Visual Studio中手动获取解决方案(特别是版本(中每个项目中所有使用的NuGet包的列表。

使用Package Manager控制台和命令"Get Package"可以得到我想要的东西,但在VS之外是不可用的。

我使用的是本地NuGet提要。我的默认包管理格式是PackageReference。

任何想法都会对有所帮助

PackageReference作为一种包管理格式只能在每个项目的基础上工作。所以你需要";分析";每个项目都是单独的。

更新:

在.NET SDK版本2.2.100及更新版本dotnet list package中。

旧版本:

在命令行中;将";是列出所有包的一种方式。这是";dotnet列表包";命令我说会的,因为它还在预览中。您可以从这里下载2.2.100版本。相关规范

最简单的用法示例是:

dotnet list YourSln.sln package

如果不想使用dotnet.exe预览,可以考虑编写自己的工具,方法是读取每个项目的资产文件,这就是实际命令的作用。如需参考,请参阅此处和此处的代码

在Visual Studio的包管理器控制台中运行此命令Get-Package | Select-Object Id, Version, LicenseUrl, ProjectName。取自以下答案:https://softwareengineering.stackexchange.com/a/286981

我相信有更好的方法可以做到这一点,但在使用PackageReferences:时,这里有一种全面的PowerShell方法

Get-Content .<solution>.sln | where { $_ -match "Project.+, ""(.+)""," } | foreach { $matches[1] } | % {Get-Content $_ | Find "<PackageReference Include" } | Sort-Object -Unique

在.sln所在的文件夹中运行它

它产生这样的输出:

<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.5.0" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Http" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="2.1.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.5" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
<PackageReference Include="StyleCop.Analyzers" Version="1.0.2">

我有意删除重复项;如果你愿意,可以省略那部分。

在我的例子中,这与Get-Package的输出相匹配,其中一个例外是Microsoft.NETCore.App,因为它在任何地方都没有被列为依赖项,但可能是从<TargetFramework>netcoreapp2.1</TargetFramework>派生的。

由于包依赖项已移动到package.config文件中,以下是由https://stackoverflow.com/users/2385218/sellotape

Get-Content .NP.sln | where { $_ -match "Project.+, ""(.+)\([^\]+).csproj"", " } | foreach { "$($matches[1])packages.config" } | % { Get-Content $_ | Find "<package id" } | Sort-Object -Unique

输出将是这样的:

<package id="AutoMapper" version="8.1.1" targetFramework="net47" />
<package id="BouncyCastle" version="1.8.5" targetFramework="net47" />
<package id="CsvHelper" version="12.1.2" targetFramework="net47" />
<package id="DnsClient" version="1.2.0" targetFramework="net47" />
<package id="EntityFramework" version="6.2.0" targetFramework="net462" />
<package id="EntityFramework" version="6.2.0" targetFramework="net47" />

对于可以使用PowerShell的.NET Core 2.2及更高版本项目,请尝试

(dotnet list package) -match '^.*>' -replace '^ +> ','' | % { $_.split(" ")[0] } | Sort-Object -Unique

dotnet list package | grep '>' | sed 's/^ *> //g;s/ +/ /g' | cut -f 1 -d ' ' | sort -u

在类似POSIX的环境中。

selotape提出,编写一个脚本来查找每个csproj文件上出现的标记PackageReference是一个好主意。

如果你的csproj文件有这样的东西,这个解决方案就不起作用了:

<PackageReference Include"SomePackage">
<Version>1.0.42</Version>
</PackageReference>

尽管我建议您更改格式以在线声明版本(如.NET Standard csproj格式(,但可能您没有时间为所有项目都这样做。

解决方案:

使用C#脚本,可以获得csproj文件中包含PackageReference作为标记名的所有项。然后你可以做两件事之一:

  1. 继续删除文本,直到找到(每个项目(这样的正则表达式:(Version="*"),它将允许您查找每个PackageReference的版本
  2. 将项目序列化为您喜欢的格式(JSON有效(,以将数据划分到字典中,您只需从中获取名称和版本,以及您可能需要的任何其他数据

我希望这能有所帮助。

我为此编写了一个C#脚本,但它没有直接使用SLN文件。相反,它在给定的目录中搜索任何packages.config文件。重复项将在列"assembly"(使用指定包的所有程序集的列表(中可见。输出将是一个CSV文件到任何给定的位置。

您可以从这里复制/下载或调整代码:源代码

您还可以使用CMD/Powershell编译上面编写的源代码:在命令提示符中编译/执行C#源文件

最新更新