如何列出 NuGet v3 API 中的所有本地包
How can I list all local packages in the NuGet v3 API
对于上下文,我正在构建一个应用程序,它需要 download/unpack 包及其来自任意包源(默认包括 public 库)的依赖项,并将这些包升级到最新版本当被要求时。没有 project.json 文件或类似文件,它们都是代码驱动的。这不是一个特别复杂的用例,在 v2 API 中不需要太多代码。
但是在 v3 中,我不知道如何正确地与本地包存储交互。例如,我认为的 FolderNuGetProject
class 列出了 FolderNuGetProject.GetInstalledPackagesAsync()
just returns an empty enumerable 中给定位置磁盘上的所有包。更让人困惑的是,FolderNuGetProject.PackageExists()
实际上是return磁盘上是否存在这个包,这意味着GetInstalledPackagesAsync()
和PackageExists()
看起来不一致。
None 的其他 NuGetProject
个派生词似乎与文件系统有关。是否有其他方式列出已安装到特定文件夹中的软件包?如果我需要创建自己的 NuGetProject
(我希望我不需要),是否有任何方法可以帮助将 NuGet 生成的文件夹名称解析为包 ID 和版本,或者是唯一可靠的方法获取 ID 和版本以打开 nuspec(是否有任何容易找到的方法)?
为什么这没有像我预期的那样工作的一种解释是 NuGetProject.GetInstalledPackagesAsync() 实际上并不是为了获取已安装的包(即那些已经下载和解压的包),而是那些已经在任何正在使用的项目系统中声明的。例如,BuildIntegratedNuGetProject
class 显示为 return 包引用 project.json 中的包,无论它们在磁盘上的状态如何。这也可以解释为什么 FolderNuGetProject
只是 return 一个空的可枚举,因为如果您只是查看本地存储库,则没有 "declared" 包。
TL;DR:爬取本地包存储并获取那里存在的包和版本的最佳方法是什么?
(这也是 NuGet GitHub 项目中的 issue #2664,但应要求移至此处)
简介
我有同样的问题,我在 GitHub、Google 和此处查看了您的 post。我尝试了很多东西来找到本地包。
我找到了一些解决方案,但我不知道这是否是最好的方法。
我也post编辑了一个关于本地包的,因为我可以列出所有本地包,但我不能AssemblyReferences
属性 (dll).
代码示例
var rootPath = @"pathWhereNuGetPackagesAre";
var logger = new Logger();
List<Lazy<INuGetResourceProvider>> providers = new List<Lazy<INuGetResourceProvider>>();
providers.AddRange(Repository.Provider.GetCoreV3());
FindLocalPackagesResourceV2 findLocalPackagev2 = new FindLocalPackagesResourceV2(rootPath);
var packageFound = findLocalPackagev2.GetPackages(logger, CancellationToken.None).FirstOrDefault();
//found, but missing a lot of informations...
var supportedFramework = new[] { ".NETFramework,Version=v4.6" };
var searchFilter = new SearchFilter(true)
{
SupportedFrameworks = supportedFramework,
IncludeDelisted = false
};
// The trick here is to put the local nuget path, not using the URL : https://api.nuget.org/v3/index.json
PackageSource localSource = new PackageSource(rootPath);
SourceRepository localRepository = new SourceRepository(localSource, providers);
PackageSearchResource searchLocalResource = await localRepository
.GetResourceAsync<PackageSearchResource>();
var packageFound3 = await searchLocalResource
.SearchAsync("Newtonsoft.Json", searchFilter, 0, 10, logger, CancellationToken.None);
var thePackage = packageFound3.FirstOrDefault();
// found but missing the assemblies property
public class Logger : ILogger
{
private List<string> logs = new List<string>();
public void LogDebug(string data)
{
logs.Add(data);
}
public void LogVerbose(string data)
{
logs.Add(data);
}
public void LogInformation(string data)
{
logs.Add(data);
}
public void LogMinimal(string data)
{
logs.Add(data);
}
public void LogWarning(string data)
{
logs.Add(data);
}
public void LogError(string data)
{
logs.Add(data);
}
public void LogInformationSummary(string data)
{
logs.Add(data);
}
public void LogErrorSummary(string data)
{
logs.Add(data);
}
}
希望这会有所帮助!
在 Visual Studio 中,打开包管理器控制台。
列出本地(已安装)包使用以下命令。
Get-Package
您可以使用以下命令列出提要上的所有可用包
Get-Package -ListAvailable
如果此命令不起作用,请检查 "Packege Manager Settings"->"Package Source" 并确认 nuget 提要配置正确。 (如果您没有看到您的供稿 URL,您应该在那里添加您的供稿。)有关详细信息:Consume nuget package from VS
您还可以从此文件检查 nuget 提要配置
C:\Users{{用户}}\AppData\Roaming\NuGet\NuGet.config
有关 nuget 配置文件的更多详细信息:nuget config file
此外,本地 nuget 包应该存储在此路径中
C:\Users{{用户}}.nuget\packages
对于上下文,我正在构建一个应用程序,它需要 download/unpack 包及其来自任意包源(默认包括 public 库)的依赖项,并将这些包升级到最新版本当被要求时。没有 project.json 文件或类似文件,它们都是代码驱动的。这不是一个特别复杂的用例,在 v2 API 中不需要太多代码。
但是在 v3 中,我不知道如何正确地与本地包存储交互。例如,我认为的 FolderNuGetProject
class 列出了 FolderNuGetProject.GetInstalledPackagesAsync()
just returns an empty enumerable 中给定位置磁盘上的所有包。更让人困惑的是,FolderNuGetProject.PackageExists()
实际上是return磁盘上是否存在这个包,这意味着GetInstalledPackagesAsync()
和PackageExists()
看起来不一致。
None 的其他 NuGetProject
个派生词似乎与文件系统有关。是否有其他方式列出已安装到特定文件夹中的软件包?如果我需要创建自己的 NuGetProject
(我希望我不需要),是否有任何方法可以帮助将 NuGet 生成的文件夹名称解析为包 ID 和版本,或者是唯一可靠的方法获取 ID 和版本以打开 nuspec(是否有任何容易找到的方法)?
为什么这没有像我预期的那样工作的一种解释是 NuGetProject.GetInstalledPackagesAsync() 实际上并不是为了获取已安装的包(即那些已经下载和解压的包),而是那些已经在任何正在使用的项目系统中声明的。例如,BuildIntegratedNuGetProject
class 显示为 return 包引用 project.json 中的包,无论它们在磁盘上的状态如何。这也可以解释为什么 FolderNuGetProject
只是 return 一个空的可枚举,因为如果您只是查看本地存储库,则没有 "declared" 包。
TL;DR:爬取本地包存储并获取那里存在的包和版本的最佳方法是什么?
(这也是 NuGet GitHub 项目中的 issue #2664,但应要求移至此处)
简介
我有同样的问题,我在 GitHub、Google 和此处查看了您的 post。我尝试了很多东西来找到本地包。
我找到了一些解决方案,但我不知道这是否是最好的方法。
我也post编辑了一个关于本地包的AssemblyReferences
属性 (dll).
代码示例
var rootPath = @"pathWhereNuGetPackagesAre";
var logger = new Logger();
List<Lazy<INuGetResourceProvider>> providers = new List<Lazy<INuGetResourceProvider>>();
providers.AddRange(Repository.Provider.GetCoreV3());
FindLocalPackagesResourceV2 findLocalPackagev2 = new FindLocalPackagesResourceV2(rootPath);
var packageFound = findLocalPackagev2.GetPackages(logger, CancellationToken.None).FirstOrDefault();
//found, but missing a lot of informations...
var supportedFramework = new[] { ".NETFramework,Version=v4.6" };
var searchFilter = new SearchFilter(true)
{
SupportedFrameworks = supportedFramework,
IncludeDelisted = false
};
// The trick here is to put the local nuget path, not using the URL : https://api.nuget.org/v3/index.json
PackageSource localSource = new PackageSource(rootPath);
SourceRepository localRepository = new SourceRepository(localSource, providers);
PackageSearchResource searchLocalResource = await localRepository
.GetResourceAsync<PackageSearchResource>();
var packageFound3 = await searchLocalResource
.SearchAsync("Newtonsoft.Json", searchFilter, 0, 10, logger, CancellationToken.None);
var thePackage = packageFound3.FirstOrDefault();
// found but missing the assemblies property
public class Logger : ILogger
{
private List<string> logs = new List<string>();
public void LogDebug(string data)
{
logs.Add(data);
}
public void LogVerbose(string data)
{
logs.Add(data);
}
public void LogInformation(string data)
{
logs.Add(data);
}
public void LogMinimal(string data)
{
logs.Add(data);
}
public void LogWarning(string data)
{
logs.Add(data);
}
public void LogError(string data)
{
logs.Add(data);
}
public void LogInformationSummary(string data)
{
logs.Add(data);
}
public void LogErrorSummary(string data)
{
logs.Add(data);
}
}
希望这会有所帮助!
在 Visual Studio 中,打开包管理器控制台。
列出本地(已安装)包使用以下命令。
Get-Package
您可以使用以下命令列出提要上的所有可用包
Get-Package -ListAvailable
如果此命令不起作用,请检查 "Packege Manager Settings"->"Package Source" 并确认 nuget 提要配置正确。 (如果您没有看到您的供稿 URL,您应该在那里添加您的供稿。)有关详细信息:Consume nuget package from VS
您还可以从此文件检查 nuget 提要配置 C:\Users{{用户}}\AppData\Roaming\NuGet\NuGet.config 有关 nuget 配置文件的更多详细信息:nuget config file
此外,本地 nuget 包应该存储在此路径中 C:\Users{{用户}}.nuget\packages