介绍
大家好,我找到了一种使用 NuGet v3 API 查找本地 NuGet 包的方法。我不知道我是否以正确的方式执行此操作,但它有效......没有很多文档。我发现的唯一有趣的文档是这个blog https://daveaglick.com/posts/exploring-the-nuget-v3-libraries-part-1。所以,我不知道我是否以正确的方式这样做。我尝试在官方 NuGet GitHub 上找到一些有关我的问题的问题。即使在谷歌上我也没有发现任何有趣的东西。
因此,我保留了我的代码,并尝试在使用 NuGet v3 API 搜索本地包时找到一种获取程序集 (dll) 的方法。我尝试了很多 NuGet 类,但似乎没有任何结果返回我的预期。有些函数返回包信息,但是AssemblyReferences
财产丢失。
我知道在 NuGet v2 API 中,搜索函数返回一个IPackage
。现在,在 v3 中,它返回一个IPackageSearchMetadata
or a LocalPackageInfo
取决于您调用的函数。因此,他们改变了返回的对象。
那么,有没有办法获得AssemblyReferences
像IPackage
在 Nuget V2 API 中?
我不知道这是否是一个问题,但是我在GitHub https://github.com/NuGet/Home/issues/5674.
使用 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 类。