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

时间:2018-11-22 17:16:56

标签: c# nuget

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

使用Package Manager Console和“ Get-Package”命令可以提供所需的信息,但是在VS之外无法使用。

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

任何想法都会有所帮助

7 个答案:

答案 0 :(得分:3)

我确定有更好的方法来执行此操作,但这是使用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>

答案 1 :(得分:2)

如selotape所建议的那样,编写一个脚本来查找每个csproj文件中标签PackageReference的出现是一个好主意。

如果您的csproj文件具有以下内容,则此解决方案将不起作用:

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

尽管我建议您更改格式以内联声明版本(如.NET Standard csproj格式),但也许您没有时间为所有项目执行该操作。

解决方案:

使用C#脚本,您可以在csproj文件中获取所有包含PackageReference作为其标记名的项目。 然后,您可以执行以下两项操作之一:

  1. 继续抓取文本,直到找到(针对每个项目)如下所示的正则表达式: (Version="*"),这将使您可以找到每个PackageReference的版本
  2. 将项目序列化为您喜欢的格式(JSON可以工作),以将数据划分为字典,您可以在其中仅从中获取名称和版本以及可能需要的任何其他数据。

我希望这会有所帮助。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

对于可以使用 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 的环境中。

答案 4 :(得分:0)

PackageReference作为程序包管理格式仅在每个项目的基础上起作用。 因此,您需要单独“分析”每个项目。

在命令行中,“将”有一种列出所有软件包的方法。 这是“ dotnet list package”命令。 我说会,因为它仍在预览中。 您可以从here下载2.2.100版本。 相关spec

最简单的用法示例是:

dotnet list package YourSln.sln

如果不想使用dotnet.exe预览,可以考虑通过读取每个项目的资产文件来编写自己的工具,这是实际命令的作用。 作为参考,请参见代码herehere

答案 5 :(得分:0)

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

您可以从此处复制/下载或调整代码: Source Code

您还可以使用CMD / Powershell编译以上编写的源代码: Compiling/Executing a C# Source File in Command Prompt

答案 6 :(得分:0)

由于软件包的依赖关系已移至package.config文件,因此这是https://stackoverflow.com/users/2385218/sellotape

提供的Powershell的更新版本。
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" />