c# - 如何列出 NuGet v3 API 中的所有本地包

标签 c# nuget

对于上下文,我正在构建一个应用程序,它需要从任意包源(默认情况下包括公共(public)库)下载/解压包及其依赖项,并在需要时将这些包升级到最新版本。没有 project.json 文件或类似文件,它都是代码驱动的。这不是一个特别复杂的用例,并且不需要在 v2 API 中编写太多代码。

然而,在 v3 中,我不知道如何正确地与本地包存储交互。例如,我认为的 FolderNuGetProject 类会在 FolderNuGetProject.GetInstalledPackagesAsync() just returns an empty enumerable 中的给定位置列出磁盘上的所有包。 .更让人困惑的是,FolderNuGetProject.PackageExists() 实际上确实返回了包是否存在于磁盘上,这意味着 GetInstalledPackagesAsync()PackageExists() 似乎不一致。

其他 NuGetProject 派生项目均未出现与文件系统相关。是否有其他方式列出已安装到特定文件夹中的软件包?如果我需要创建自己的 NuGetProject(我希望我不需要),是否有任何方法可以帮助将 NuGet 生成的文件夹名称解析为包 ID 和版本,或者是获取打开 nuspec 的 ID 和版本的唯一可靠方法(是否有任何容易找到的方法)?

为什么这不像我预期的那样工作的一种解释是 NuGetProject.GetInstalledPackagesAsync() 实际上并不是为了获取已安装的包(即,那些已经下载和解压的),而是那些已经在任何正在使用的项目系统中声明。例如,BuildIntegratedNuGetProject 类似乎会返回 project.json 中包的包引用,而不管它们在磁盘上的状态如何。这也可以解释为什么 FolderNuGetProject 只返回一个空的可枚举对象,因为如果您只是查看本地存储库,则没有“声明的”包。

TL;DR:抓取本地包存储并获取那里存在的包和版本的最佳方法是什么?

(这也是 NuGet GitHub 项目上的 issue #2664,但应要求移至此处)

最佳答案

简介

我有同样的问题,我看了你在 GitHub 上的帖子,谷歌和这里。我尝试了很多东西来找到本地包。 我找到了一些解决方案,但我不知道这是否是最好的方法。 我发布了 question关于本地包,因为我可以列出所有本地包,但我不能拥有 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);
    }
}

希望这会有所帮助!

关于c# - 如何列出 NuGet v3 API 中的所有本地包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898032/

相关文章:

C# 循环遍历给定标签的数组

c# - 在 ASP.NET MVC 4 中使用 id 路由到索引

nuget - 使用具有特定预发布标签的 Nuget 包

c# - 为什么我有时需要添加 Nuget 依赖项,即使我的项目没有直接使用它们?

c# - 在多包八达通作业中选择最新的包版本

c# - ASP.Net Core BackgroundService被无故取消

c# - 生成 JSON 结构

.net - NuGet 框架程序集不起作用

c# - 如何操纵回发优先级?

version-control - Nuget - 在源代码管理中存储包,还是不?