对于上下文,我正在构建一个应用程序,需要从任意包源(默认情况下包括公共库)下载/解压缩包及其依赖项,并在请求时将这些包升级到最新版本.没有project.json文件或类似文件,它都是代码驱动的.它不是一个特别复杂的用例,并且在v2 API中不需要太多代码.
但是在v3中,我无法弄清楚如何正确地与本地包存储进行交互.例如,FolderNuGetProject我想到的类列出了给定位置的磁盘上的所有包,FolderNuGetProject.GetInstalledPackagesAsync() 只返回一个空的可枚举.为了使问题更加混乱,FolderNuGetProject.PackageExists()实际上确实返回磁盘上是否存在包,这意味着GetInstalledPackagesAsync()并且PackageExists()看起来不一致.
其他NuGetProject衍生物都不会与文件系统相关.是否有其他方法列出已安装到特定文件夹中的软件包?如果我需要创建自己的NuGetProject(并且我希望我不这样做),是否有任何方法可以帮助将NuGet生成的文件夹名称解析为包ID和版本,或者是获取ID的唯一可靠方法打开nuspec的版本(有没有容易找到的方法)?
一个解释为什么这不能正常工作的原因是NuGetProject.GetInstalledPackagesAsync()实际上并不是为了获取已安装的软件包(即已经下载和解压缩的软件包),而是那些已经被声明的软件包项目系统正在使用中.例如,BuildIntegratedNuGetProject类似乎返回project.json中包的包引用,而不管它们在磁盘上的状态如何.这也可以解释为什么FolderNuGetProject只返回一个空的可枚举,因为如果你只是查看本地存储库,就没有"声明"的包.
TL; DR:抓取本地软件包商店并获取其中存在的软件包和版本的最佳方法是什么?
(这也是NuGet GitHub项目的问题#2664,但是被请求移到了这里)
我有同样的问题,我在GitHub、Google 和这里查看了你的帖子。我尝试了很多方法来找到本地软件包。我找到了一些解决方案,但我不知道这是否是最好的方法。我也发布了有关本地包的问题,因为我可以列出所有本地包,但我无法拥有该AssemblyReferences属性(dll)。
var rootPath = @"pathWhereNuGetPackagesAre";
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...
var supportedFramework = new[] { ".NETFramework,Version=v4.6" };
var searchFilter = new SearchFilter(true)
{
SupportedFrameworks = supportedFramework,
IncludeDelisted = false
};
// The trick here is to put the local nuget path, not using the URL : https://api.nuget.org/v3/index.json
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
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);
}
}
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助!
| 归档时间: |
|
| 查看次数: |
1179 次 |
| 最近记录: |