2017-07-30 109 views
1

简介

大家好,我找到了一种方法来找到使用NuGet v3 API的本地NuGet包。我不知道我是否以正确的方式进行操作,但是它可以工作......没有很多文档。我发现的唯一有趣的文档是这个blog。所以,我不知道我是否以正确的方式去做。我尝试在官方的NuGet GitHub上找到关于我的问题的一些问题。即使在Google上我也没有发现任何有趣的事情。如何在NuGet v3 API中为本地程序包创建程序集(dll)?

因此,我保留我的代码,并试图在使用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<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); 
    } 
} 

我知道我可以列出所有的DLL文件

代码示例使用DirectoryInfo,但我正在寻找一个NuGet类来完成逻辑。

回答

0

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

希望这会有所帮助!