簡體   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