C# 如何在NuGet v3 API中列出所有本地包
对于上下文,我正在构建一个应用程序,它需要从任意包源(默认情况下包括公共库)下载/解包包包及其依赖项,并在请求时将这些包升级到最新版本。没有project.json文件或类似文件,都是代码驱动的。它不是一个特别复杂的用例,在v2api中也不需要太多代码 然而,在v3中,我不知道如何正确地与本地包存储交互。例如,我本以为C# 如何在NuGet v3 API中列出所有本地包,c#,nuget,C#,Nuget,对于上下文,我正在构建一个应用程序,它需要从任意包源(默认情况下包括公共库)下载/解包包包及其依赖项,并在请求时将这些包升级到最新版本。没有project.json文件或类似文件,都是代码驱动的。它不是一个特别复杂的用例,在v2api中也不需要太多代码 然而,在v3中,我不知道如何正确地与本地包存储交互。例如,我本以为FolderNuGetProject类在FolderNuGetProject.getInstalledPackageAsync()中列出了磁盘上给定位置的所有包。更令人困惑的是,F
FolderNuGetProject
类在FolderNuGetProject.getInstalledPackageAsync()
中列出了磁盘上给定位置的所有包。更令人困惑的是,FolderNuGetProject.PackageExists()
实际上会返回包是否存在于磁盘上,这意味着getInstalledPackageAsync()
和PackageExists()
似乎不一致
其他的NuGetProject
衍生工具似乎都与文件系统无关。是否有其他方法列出已安装到特定文件夹中的软件包?如果我需要创建自己的NuGetProject
(我希望我不需要),是否有任何方法可以帮助将NuGet生成的文件夹名称解析为包ID和版本,或者是获取ID和版本以打开nuspec的唯一可靠方法(是否有任何易于找到的方法)
对于这一点没有像我预期的那样起作用的一种解释是,NuGetProject.GetInstalledPackageAsync()实际上并不打算获取已安装的软件包(即已下载和解包的软件包),而是那些已在使用的任何项目系统中声明的软件包。例如,BuildIntegratedNuGetProject
类会返回project.json中包的包引用,而不管它们在磁盘上的状态如何。这也解释了为什么FolderNuGetProject
只返回一个空的枚举,因为如果您只是查看本地存储库,就没有“声明”的包
TL;DR:对本地软件包商店进行爬网并获取其中存在的软件包和版本的最佳方法是什么
(这也是NuGet GitHub项目中的内容,但根据请求被移到了这里)简介
我有同样的问题,我看了你的文章,谷歌和这里。我尝试了很多东西来寻找当地的包裹。
我找到了一些解决办法,但我不知道这是不是最好的办法。
我也发布了一篇关于本地包的文章,因为我可以列出所有本地包,但是我不能拥有AssemblyReferences
属性(dll)
代码示例
var rootPath=@“pathWhereNuGetPackagesAre”;
变量记录器=新记录器();
列表提供程序=新列表();
providers.AddRange(Repository.Provider.GetCoreV3());
FindLocalPackagesResourceV2 FindLocalPackagesv2=新的FindLocalPackagesResourceV2(根路径);
var packageFound=findLocalPackagev2.GetPackages(记录器,CancellationToken.None).FirstOrDefault();
//找到了,但丢失了很多信息。。。
var-supportedFramework=new[]{.NETFramework,版本=v4.6“};
var searchFilter=新的searchFilter(真)
{
supportedFramework=supportedFramework,
IncludeDelisted=假
};
//这里的技巧是放置本地nuget路径,而不是使用URL:https://api.nuget.org/v3/index.json
PackageSource localSource=新的PackageSource(根路径);
SourceRepository localRepository=新的SourceRepository(localSource,providers);
PackageSearchResource searchLocalResource=等待localRepository
.GetResourceAsync();
var packageFound3=等待searchLocalResource
.SearchAsync(“Newtonsoft.Json”、searchFilter、0、10、logger、CancellationToken.None);
var thePackage=packageFound3.FirstOrDefault();
//找到但缺少Assemblys属性
公共类记录器:ILogger
{
私有列表日志=新列表();
公共void LogDebug(字符串数据)
{
日志。添加(数据);
}
公共void LogVerbose(字符串数据)
{
日志。添加(数据);
}
公共无效登录信息(字符串数据)
{
日志。添加(数据);
}
公共void LogMinimal(字符串数据)
{
日志。添加(数据);
}
公共无效日志警告(字符串数据)
{
日志。添加(数据);
}
公共无效日志错误(字符串数据)
{
日志。添加(数据);
}
公共void登录信息摘要(字符串数据)
{
日志。添加(数据);
}
公共void LogErrorSummary(字符串数据)
{
日志。添加(数据);
}
}
希望这会有帮助 在Visual Studio中,打开包管理器控制台 使用以下命令列出本地(已安装)软件包
Get-Package
您可以使用以下命令列出提要上所有可用的包
Get-Package -ListAvailable
如果此命令不起作用,请检查“打包管理器设置”->“包源”,并确认nuget提要配置正确。(如果你没有看到你的提要URL,你应该在那里添加你的提要。)有关详细信息:
您还可以从此文件中检查nuget提要配置
C:\Users{{user}}\AppData\Roaming\NuGet\NuGet.config
有关nuget配置文件的更多详细信息:
此外,本地nuget包应该存储在此路径中
C:\Users{{user}}.nuget\packages问题是如何使用nuget库来实现这一点。
Get-Package -ListAvailable