如何在NuGet v3 API中为本地包提供程序集(dll)?

时间:2017-07-30 15:13:03

标签: c# .net nuget nuget-package

简介

大家好,我找到了一种使用NuGet v3 API查找本地NuGet包的方法。我不知道我是否以正确的方式做到了,但它确实有效......没有很多文档。我找到的唯一有趣的文档是blog。所以,我不知道我是否以正确的方式做到了。我试着在官方的NuGet GitHub上找到关于我的问题的一些问题。我甚至在Google上都没有发现任何有趣的东西。

所以,我保留了我的代码,当我使用NuGet v3 API搜索本地包时,我试图找到一种获取程序集(dll)的方法。我尝试了很多NuGet类,但似乎没有什么能回复我的预期。某些函数返回包信息,但缺少AssemblyReferences属性。

我知道在NuGet v2 API中,搜索功能返回IPackage。现在,在v3中,它会返回IPackageSearchMetadataLocalPackageInfo,具体取决于您调用的函数。所以,他们改变了返回的对象。

那么,有没有办法像Nuget V2 API中的AssemblyReferences一样获得IPackage

我不知道这是不是问题,但是我在GitHub上发布了。

使用Nuget V2 API(工作)的代码示例

var rootPath = @"pathWhereNugetPackageAre";
LocalPackageRepository repo1 = new LocalPackageRepository(rootPath);
var newtonsoft = repo1.FindPackagesById("Newtonsoft.Json").First();
//return the package and the assembly property because it's v2

使用Nuget V3 API的代码示例(我尝试过的)

var rootPath = @"pathWhereNugetPackageAre";
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...

FindLocalPackagesResourceV3 findLocalPackagev3 = new FindLocalPackagesResourceV3(rootPath);
var packageNotFound = findLocalPackagev3.GetPackages(logger, CancellationToken.None)
    .FirstOrDefault();
// I don't know why it is null. It should be found

NuGetv3LocalRepository nugetV3LocalRepo = new NuGetv3LocalRepository(rootPath);
var newtonsoftToFound = nugetV3LocalRepo.FindPackagesById("Newtonsoft.Json")
    .FirstOrDefault();
// return empty I don't know why...

var supportedFramework = new[] { ".NETFramework,Version=v4.6" };
var searchFilter = new SearchFilter(true)
{
    SupportedFrameworks = supportedFramework,
    IncludeDelisted = false
};

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

// Logger class
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);
    }
}
  

我知道我可以使用DirectoryInfo列出所有dll文件,但我正在搜索执行逻辑的NuGet类。

1 个答案:

答案 0 :(得分:1)

@emgarten他在GitHub

上回答了我的问题
  

要查找本地文件夹中的包,请查看:https://github.com/NuGet/NuGet.Client/blob/dev/src/NuGet.Core/NuGet.Protocol/Utility/LocalFolderUtility.cs

     

请注意,v2和v3文件夹需要存在不同的结构和文件,因此如果未返回包,则可能是因为它不在预期位置或者nupkg之外的其他文件不存在。

     

您可以使用PackageArchiveReader阅读包,其中的数据类似于IPackage

您可以使用PackageArchiveReader在NuGet包中提取信息。您可以使用GetFiles()或其他功能(许多功能可用)。就我而言,我使用GetReferenceItems(),因为它按目标框架分组。因此,使用目标框架获得正确的程序集会更有趣。

注意:如果您在查找包含GetPackageV2()GetPackageV3()的软件时遇到问题,请确保您拥有有效的V2结构文件夹或V3结构文件夹。我将我的NuGet文件夹与我的NuGet Visual Studio文件夹进行了比较,并且缺少一些文件(* .nuspec,* nupkg.sha512 ...)。应该是缺少V3搜索不起作用。我将我的NuGet文件夹与我的上一个项目(NuGet v2)进行了比较,文件夹和文件是相同的。所以,我使用了GetPackageV2()

希望这会有所帮助!