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

C# 获取解决方案中使用的所有NuGet包的列表,c#,nuget,C#,Nuget,我正在寻找一种方法来获取解决方案中每个项目中使用的所有NuGet包的列表,特别是使用命令行脚本而不是在VisualStudio中手动获取的版本 使用带有命令Get Package的Package管理器控制台可以得到我想要的东西,但是在VS之外它是不可用的 我用的是一个本地的NuGet提要。 我的默认包管理格式是PackageReference 任何想法都会很有帮助我相信有更好的方法可以做到这一点,但在使用PackageReference时,这里有一个简单的方法: Get-Content .\&l

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

使用带有命令Get Package的Package管理器控制台可以得到我想要的东西,但是在VS之外它是不可用的

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


任何想法都会很有帮助

我相信有更好的方法可以做到这一点,但在使用PackageReference时,这里有一个简单的方法:

Get-Content .\<solution>.sln | where { $_ -match "Project.+, ""(.+)""," } | foreach { $matches[1] } | % {Get-Content $_ | Find "<PackageReference Include" } | Sort-Object -Unique
在.sln所在的文件夹中运行它

它产生如下输出:

<PackageReference Include"SomePackage">
    <Version>1.0.42</Version>
</PackageReference>
<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" />
我故意删除副本;如果你愿意的话,可以省略那部分


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

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

在命令行中,可以列出所有包。 这是dotnet列表包命令。 我说会的,因为它还在预览中。 您可以从下载2.2.100版本。 相关的

最简单的用法示例是:

dotnet list YourSln.sln package

如果您不想使用dotNET.EXE预览,您可以考虑编写自己的工具,通过读取每个项目的资产文件,这是实际命令所做的。


如selotape所建议的,请参见代码和编写脚本以查找每个csproj文件上出现的标记包引用,这是一个好主意

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

<PackageReference Include"SomePackage">
    <Version>1.0.42</Version>
</PackageReference>
<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" />
尽管我建议您将格式更改为以.NET标准csproj格式在线声明版本,但您可能没有时间为所有项目执行此操作

解决方案: 使用C脚本,您可以获取csproj文件中包含PackageReference作为标记名的所有项。 然后你可以做两件事中的一件:

继续文本删除,直到找到每个项目的正则表达式,如下所示: Version=*,这将允许您查找每个PackageReference的版本 将项目序列化为您最喜欢的格式JSON可以将数据划分到字典中,在字典中您只需获取名称和版本,以及您可能需要的任何其他数据。
我希望这能有所帮助。

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

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

您还可以使用CMD/Powershell编译上述编写的源代码:

由于软件包依赖项已移动到package.config文件中,以下是由提供的Powershell的更新版本

输出将如下所示:

<PackageReference Include"SomePackage">
    <Version>1.0.42</Version>
</PackageReference>
<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" />

在Visual Studio的包管理器控制台中运行此命令获取包|选择对象Id、版本、许可证URL、项目名称。摘自此答案:

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

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


在类似POSIX的环境中。

您不能从项目文件中读取它们吗?它们在每个项目的纯文本packages.config中都有明确的列表。通常会有关于包在项目文件中的位置的提示,但是Nuget package restore使用packages.config。@JeffDavies感谢您的回答。我有一个150多个项目的解决方案。所以搜索对我来说可能不是最好的解决方案,但这样做就行了。谢谢@Avihay,此powershell命令将列出所有包。configs:Get ChildItem-Path$Path-Recurse-Filter packages.config |选择全名。我对powershell不够精通,无法从列表中查找文件内容。可以在Bash中轻松完成。好主意。但由于某些原因,它没有显示版本号。i、 有什么我遗漏的吗@sellotape@Avihay-它只是在那里的csproj中显示线路。查看一下您的.csproj,看看是否有与我的示例中的完全不同的地方。诚然,这是一个很好的尝试,但任何阅读本文的人都必须记住,这可能无法准确地表示包引用,因为MSBuild或dotnet cli将解决这些引用。更复杂的场景意味着有条件的版本引用可能会导致问题。在Directory.Build.props文件中,还可能存在对为所有项目设置一次的包的引用。当然,这是不太可能的。但它可能发生在一些拥有私有包的商店中,这些包仅仅是用于MSBuild协助和/或仅用于
包含私有资产。只是一个想法:提取dotnet列表包的输出可能更安全?这只适用于.NET Core和.NET 5.0。它适用于基于SDK的项目。目标框架和工具之间存在差异。这是一个工具特性,因此与.NET5.0没有真正的关系。它适用于基于SDK的项目,这些项目的目标不仅仅是.NET核心。我们如何获得该版本?