gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:49:57 26 4
gpt4 key购买 nike

对于上下文,我正在构建一个应用程序,它需要从任意包源(默认情况下包括公共(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com