簡介
大家好,我找到了一種方法來找到使用NuGet v3 API的本地NuGet包。我不知道我是否以正確的方式進行操作,但是它可以工作......沒有很多文檔。我發現的唯一有趣的文檔是這個blog。所以,我不知道我是否以正確的方式去做。我嘗試在官方的NuGet GitHub上找到關於我的問題的一些問題。即使在Google上我也沒有發現任何有趣的事情。如何在NuGet v3 API中爲本地程序包創建程序集(dll)?
因此,我保留我的代碼,並試圖在使用NuGet v3 API搜索本地包時找到獲取程序集(dll)的方法。我嘗試了很多NuGet類,但似乎沒有返回我所期望的。一些函數返回包信息,但AssemblyReferences
屬性丟失。
我知道在NuGet v2 API中,搜索函數返回一個IPackage
。現在,在v3中,它將返回一個IPackageSearchMetadata
或LocalPackageInfo
,具體取決於您所調用的功能。所以,他們改變了返回的對象。
那麼,有沒有辦法像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類來完成邏輯。