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

时间:2016-04-27 18:28:21

标签: c# nuget

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

但是在v3中,我无法弄清楚如何正确地与本地包存储进行交互。例如,我想到的FolderNuGetProject类列出了FolderNuGetProject.GetInstalledPackagesAsync() just returns an empty enumerable中给定位置的磁盘上的所有软件包。为了使问题更加混乱,FolderNuGetProject.PackageExists()实际上确实返回磁盘上是否存在包,这意味着GetInstalledPackagesAsync()PackageExists()似乎不一致。

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

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

TL; DR:抓取本地软件包商店并获取其中存在的软件包和版本的最佳方法是什么?

(这也是NuGet GitHub项目的issue #2664,但是被要求移到了这里)

2 个答案:

答案 0 :(得分:1)

简介

我有同样的问题,我在GitHub,Google和此处查看了您的帖子。我尝试了很多东西来找到本地包。 我找到了一些解决方案,但我不知道这是否是最好的方法。 我发布了一个关于本地软件包的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);
    }
}

希望这会有所帮助!

答案 1 :(得分:-1)

在Visual Studio中,打开包管理器控制台。

enter image description here

列出本地(已安装)软件包使用以下命令。

OutputStream

您可以使用以下命令

列出Feed上的所有可用包
Get-Package

如果此命令不起作用,请选中“Packege Manager Settings” - >“Package Source”并确认正确配置nuget feed。 (如果您没有看到自己的Feed网址,则应在此处添加Feed。)了解详情:Consume nuget package from VS

您还可以从此文件中检查nuget Feed配置 C:\用户{{用户}} \应用程序数据\漫游\的NuGet \ NuGet.config 有关nuget配置文件的更多详细信息:nuget config file

此外,本地nuget包应存储在此路径中 C:\用户{{用户}}的NuGet \包