gpt4 book ai didi

c# - 如何在 NuGet v3 API 中拥有本地包的程序集 (dll)?

转载 作者:太空宇宙 更新时间:2023-11-03 12:25:06 24 4
gpt4 key购买 nike

简介

大家好,我找到了一种使用 NuGet v3 API 查找本地 NuGet 包的方法。我不知道我是否以正确的方式进行操作,但它确实有效......没有很多文档。我发现的唯一有趣的文档是这个 blog .所以,我不知道我是否以正确的方式去做。我试图在官方 NuGet GitHub 上找到一些关于我的问题的问题。即使在 Google 上我也没有发现任何有趣的东西。

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

I know I can list all dlls file using the DirectoryInfo, but I'm searching a NuGet class that does the logic.

最佳答案

@emgarten 他在 GitHub 上回答了我的问题

For finding packages in local folders take a look at: https://github.com/NuGet/NuGet.Client/blob/dev/src/NuGet.Core/NuGet.Protocol/Utility/LocalFolderUtility.cs

Note that v2 and v3 folders expect different structures and files to be present, so if a package is not returned it is likely because it isn't in the expected location or additional files beyond the nupkg were not in place.

You can read a package using PackageArchiveReader which gives you data similar to IPackage.

您可以使用 PackageArchiveReader 提取有关 NuGet 包的信息。您可以使用 GetFiles() 或其他函数(有许多函数可用)。在我的例子中,我使用了 GetReferenceItems(),因为它是按目标框架分组的。因此,使用目标框架获得正确的程序集会更有趣。

注意:如果您在使用 GetPackageV2()GetPackageV3() 查找包时遇到问题,请确保您具有有效的 V2 结构文件夹或 V3 结构文件夹。我将我的 NuGet 文件夹与我的 NuGet Visual Studio 文件夹进行了比较,发现一些文件丢失了(*.nuspec、*nupkg.sha512...)。应该是这个缺失导致V3搜索没有成功。我将我的 NuGet 文件夹与我的上一个项目 (NuGet v2) 进行了比较,文件夹和文件是相同的。所以,我使用了 GetPackageV2()

希望这会有所帮助!

关于c# - 如何在 NuGet v3 API 中拥有本地包的程序集 (dll)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45401314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com