我正在寻找一种使用命令行脚本而不是在Visual Studio中手动获取解决方案中每个项目(特别是版本)中所有已使用NuGet软件包的列表的方法。
使用Package Manager Console和“ Get-Package”命令可以提供所需的信息,但是在VS之外无法使用。
我正在使用的是本地NuGet提要。 我的默认软件包管理格式是PackageReference。
任何想法都会有所帮助
答案 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作为其标记名的项目。 然后,您可以执行以下两项操作之一:
(Version="*")
,这将使您可以找到每个PackageReference的版本我希望这会有所帮助。
答案 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预览,可以考虑通过读取每个项目的资产文件来编写自己的工具,这是实际命令的作用。 作为参考,请参见代码here和here
答案 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" />