配置 NuGet Client SDK 以指定特定框架

问题描述 投票:0回答:2

我有以下代码示例(取自this Gist)用于将 NuGet 包及其依赖项下载到特定文件夹:

public async Task<HashSet<PackageIdentity>> InstallPackageAndDependenciesAsync(PackageIdentity identity)
{
    bool allowUnlisted = false;
    bool includePrelease = true;

    try
    {
        ResolutionContext resolutionContext = new ResolutionContext(
            DependencyBehavior.Lowest,
            includePrelease,
            allowUnlisted,
            VersionConstraints.ExactMajor | VersionConstraints.ExactMinor);

        INuGetProjectContext projectContext = new BlankProjectContext(Settings.Settings, new NuGetCustomLogger());

        var installActions = await LocalNuGetPackageManager.PreviewInstallPackageAsync(
            LocalNuGetPackageManager.PackagesFolderNuGetProject, identity,
            resolutionContext, projectContext,
            new[] { RemoteNuGetFeed }, Array.Empty<SourceRepository>(),
            CancellationToken.None);

        var sourceCache = new SourceCacheContext();
        await LocalNuGetPackageManager.ExecuteNuGetProjectActionsAsync(LocalNuGetPackageManager.PackagesFolderNuGetProject, installActions, projectContext, sourceCache, CancellationToken.None);

        return new HashSet<PackageIdentity>(installActions.Select(action => action.PackageIdentity));
    }
    catch (Exception ex)
    {
        throw;
    }
} 

这有效,但它会下载所有支持的 .NET 版本(.NET 标准 2.1、UWP、net45 等)的二进制文件

我如何配置它,以便它只下载适合特定目标框架的包版本,例如.NET 6.0?

编辑 有关如何在运行时为目标包动态加载所需程序集的信息的奖励。如果我需要修改我的 NuGet 以包含 json.deps,那很好。

c# nuget nuget-package
2个回答
0
投票

我不认为您可以使用请求的框架来请求 NuGet API。 通过搜索包,您有一些元数据可以帮助您。 在找到好的元数据的同时,您必须需要搜索并下载包。

有关 NuGet 客户端的 Microsoft Doc 的更多信息:https://learn.microsoft.com/en-us/nuget/reference/nuget-client-sdk

这篇文章可以帮助您找到具有所需框架的解决方案:https://www.daveaglick.com/posts/exploring-the-nuget-v3-libraries-part-2


0
投票

要仅下载适用于特定目标框架的包版本,您可以将 Framework 属性添加到 ResolutionContext 对象并将其设置为您要使用的目标框架。这是一个例子:

Framework framework = new FrameworkName(".NETCoreApp,Version=v6.0");
ResolutionContext resolutionContext = new ResolutionContext(
    DependencyBehavior.Lowest,
    includePrelease,
    allowUnlisted,
    VersionConstraints.ExactMajor | VersionConstraints.ExactMinor,
    framework);

这会将目标框架设置为 .NET 6.0,因此只会下载支持 .NET 6.0 的包。

要在运行时动态加载目标包所需的程序集,您可以使用 Assembly.LoadFrom 方法从包的 lib 文件夹中加载程序集。这是一个例子:

string packageId = "MyPackage";
string packageVersion = "1.0.0";
string assemblyName = "MyAssembly.dll";

string packagePath = Path.Combine(LocalNuGetPackageManager.PackagesFolderSourceRepository.PackageSource.Source, packageId, packageVersion);
string assemblyPath = Path.Combine(packagePath, "lib", "net6.0", assemblyName);

Assembly assembly = Assembly.LoadFrom(assemblyPath);

这会从支持 .NET 6.0 的“MyPackage”版本“1.0.0”加载程序集“MyAssembly.dll”。请注意,您需要修改 assemblyName 和 framework 变量以匹配要加载的包的程序集名称和目标框架。如果包有依赖项,您还需要以类似的方式加载它们的程序集。

© www.soinside.com 2019 - 2024. All rights reserved.