首页 > 解决方案 > .NET Core 如何以编程方式检索具有相同所有者的所有 nuget 包元数据?

问题描述

使用 .NET Core/Standard (C#) 我想检索特定所有者的所有 nuget 包的详细信息。

例如,提供“charliepoole”会给我页面上的所有相关包:https ://www.nuget.org/profiles/charliepoole

我目前正在使用包NuGet.ProjectModel按 ID/版本检索单个包,但似乎没有任何其他相关方法可以帮助我。

作为参考,这是我按 ID 和版本检索单个包的方式:

public async Task<IPackageSearchMetadata> GetPackageAsync(string id, string version, CancellationToken cancellationToken = default)
{
    var packageSource = new PackageSource("https://api.nuget.org/v3/index.json", "NugetV3");

    var providers = new List<Lazy<INuGetResourceProvider>>();

    providers.AddRange(Repository.Provider.GetCoreV3());

    var repo = new SourceRepository(packageSource, providers);


    var packageMetadataResource = await repo.GetResourceAsync<PackageMetadataResource>(cancellationToken);

    var packageIdentity = new PackageIdentity(id, NuGetVersion.Parse(version));

    var context = new SourceCacheContext
    {
        NoCache = true,
        DirectDownload = true
    };

    return await packageMetadataResource
        .GetMetadataAsync(packageIdentity, context, new NullLogger(), cancellationToken);
}

这是否可以使用与 nuget API 对话的任何官方提供的 nuget 包?

标签: c#.net-corenuget

解决方案


这是否可以使用与 nuget API 对话的任何官方提供的 nuget 包?

不是真的,不。

NuGet 客户端团队将他们在 nuget.org 上发布的包称为NuGet (Client) SDK。NuGet.Protocol 是实现 NuGet服务器 HTTP API客户端的包。NuGet SDK 没有实现所有的服务器 API,只是 Visual Studio 中使用的部分。

由于您的问题是关于搜索的,因此搜索文档是相关的。查看响应模式,我们可以看到这owners是字段之一,但查看请求参数,没有查询可以专门询问所有者。

因此,您可以尝试将您感兴趣的 nuget.org 帐户名作为搜索关键字传递,并希望搜索索引具有该信息。当您返回结果时,您可以检查每个包并忽略那些没有您正在寻找的包所有者帐户的包。

另外两个具有包元数据的服务器 API 资源是目录(摄取管道处理的所有包的事务日志)和包元数据,但都不显示所有者信息。

但是,NuGet 服务器团队的问题跟踪器是 GitHub 的 NuGet/NuGetGallary 存储库,我发现了一个问题,询问如何在 nuget.org 上获取给定包的所有者列表。他们承认这是协议的一个缺点。您可以对该问题进行投票以表明它很重要(到目前为止只有 1 个投票,所以这对大多数客户来说似乎并不重要)。但他们也回复了一个非官方的、未记录的 URL,其中包含所有包的所有者列表。您可以使用它,但显然要考虑理论上它可能随时更改的风险。话虽如此,该评论是2年前发布的,现在仍然有效。


推荐阅读