2017-07-30 108 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()

希望這會有所幫助!