繁体   English   中英

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

[英]Get a list of all NuGet packages used in a solution

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

使用带有命令“Get-Package”的包管理器控制台给了我我想要的东西,但它在 VS 之外不可用。

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

任何想法都会有所帮助

PackageReference 作为包管理格式仅适用于每个项目。 因此,您需要单独“分析”每个项目。

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

最简单的用法示例是:

dotnet list YourSln.sln package

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

我确信有更好的方法可以做到这一点,但在使用 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>派生的。

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

由于软件包依赖项已移动到 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" />

对于可以使用 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 文件。 重复项将在“程序集”列(使用指定包的所有程序集的列表)中可见。 输出将是任何给定位置的 CSV 文件。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM