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

介绍

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

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

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

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

我不知道这是不是问题,但是我在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> providers = new List<Lazy>(); 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(); 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 logs = new List(); 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类。

@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()

希望这会有所帮助!