【问题标题】:How to download and unzip packages using NuGet v3 API如何使用 NuGet v3 API 下载和解压缩包
【发布时间】:2016-09-19 09:07:31
【问题描述】:

我一直在使用 NuGet.Core 包中的以下代码,我在 http://blog.nuget.org/20130520/Play-with-packages.html 上找到了该代码

//ID of the package to be looked up
string packageID = "EntityFramework";

//Connect to the official package repository
IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository("https://packages.nuget.org/api/v2");

//Initialize the package manager string path = <PATH_TO_WHERE_THE_PACKAGES_SHOULD_BE_INSTALLED>
PackageManager packageManager = new PackageManager(repo, path);

//Download and unzip the package
packageManager.InstallPackage(packageID, SemanticVersion.Parse("5.0.0"));

这非常有效,但我必须将框架更新为 NuGet.Core 包不支持的 .NET Core。 我认为 NuGet.Protocol.Core.v3 包应该有我需要的东西,但我一直找不到办法。我在http://daveaglick.com/posts/exploring-the-nuget-v3-libraries-part-1上找到了大量有关 NuGet v3 API 的信息

所以我的问题是:如何使用 NuGet v3 以编程方式下载和解压缩包?

【问题讨论】:

  • 你有想过这个吗?
  • @BigJoe714,对不起,我现在才注意到你的评论。我没弄明白,但devwhyst只是添加了一个值得一看的详细答案。
  • 你为什么要这样做?你想达到什么目的

标签: c# nuget .net-core


【解决方案1】:

简介

我在一些项目中使用 nuget v2。最近我测试了nuget v3,因为有很多包抛出错误提示使用nuget v3。因此,我尝试在示例项目中测试 nuget v3。我不是专家,但下载有效。

项目类型

我发现了 3 种类型的 NuGet 项目。

  • PackagesConfigNuGetProject
  • FolderNuGetProject
  • MSBuildNuGetProject

PackagesConfigNuGetProject:

表示由 packages.config 表示的 NuGet 项目。

注意:它将在 packages.config 中下载您的包(实际上,它会在 packages.config 中为您的包添加一个条目)。您的 NuGet 包不会在您的磁盘中,仅在 packages.config 中。所以如果要获取或使用dll,需要使用FolderNuGetProject #

FolderNuGetProject:

此类表示基于文件夹的 NuGetProject,例如 VisualStudio 解决方案上的 packages 文件夹。

如果您希望将软件包安装在磁盘上,请使用此类。 #

MSBuildNuGetProject:

此类表示基于 .NET 项目的 NuGetProject。这还包含一个 FolderNuGetProject 的实例

我不知道你想使用什么项目类型。在此示例中,我选择了 FolderNuGetProject。

代码示例

1- 初始化源代码库

List<Lazy<INuGetResourceProvider>> providers = new List<Lazy<INuGetResourceProvider>>();
providers.AddRange(Repository.Provider.GetCoreV3());

PackageSource packageSource = new PackageSource("https://api.nuget.org/v3/index.json");
SourceRepository sourceRepository = new SourceRepository(packageSource, providers);
Logger logger = new Logger();

2- 初始化 Nuget 包管理器

var rootPath = @"yourPathToNugetFolder";
var settings = Settings.LoadDefaultSettings(rootPath, null, new MachineWideSettings());
var packageSourceProvider = new PackageSourceProvider(settings);
var sourceRepositoryProvider = new SourceRepositoryProvider(packageSourceProvider, providers);

var project = new FolderNuGetProject(rootPath);
var packageManager = new NuGetPackageManager(sourceRepositoryProvider, settings, rootPath)
{
    PackagesFolderNuGetProject = project
};

3- 搜索一个包(在这个例子中我选择了:Newtonsoft.Json)

var searchResource = await sourceRepository.GetResourceAsync<PackageSearchResource>();
var supportedFramework = new[] { ".NETFramework,Version=v4.6" };
var searchFilter = new SearchFilter(true)
{
    SupportedFrameworks = supportedFramework,
    IncludeDelisted = false
};

var jsonNugetPackages = await searchResource
    .SearchAsync("Newtonsoft.Json", searchFilter, 0, 10, logger, CancellationToken.None);

4- 安装包 (Newtonsoft.Json)

在项目中安装 nuget 包时要小心。它将冻结用户界面。你应该使用BackgroundWorker 或类似的东西来完成这个过程。

var allowPrereleaseVersions = true;
var allowUnlisted = false;
INuGetProjectContext projectContext = new ProjectContext();
ResolutionContext resolutionContext = new ResolutionContext(
    DependencyBehavior.Lowest,
    allowPrereleaseVersions,
    allowUnlisted,
    VersionConstraints.None);

var jsonPackage = jsonNugetPackages.First();
var identity = new PackageIdentity(jsonPackage.Identity.Id, jsonPackage.Identity.Version);
await packageManager.InstallPackageAsync(
    project,
    identity,
    resolutionContext,
    projectContext,
    sourceRepository,
    new List<SourceRepository>(),
    CancellationToken.None);

5- 实用程序类

public class MachineWideSettings : IMachineWideSettings
{
    private readonly Lazy<IEnumerable<Settings>> _settings;

    public MachineWideSettings()
    {
        var baseDirectory = NuGetEnvironment.GetFolderPath(NuGetFolderPath.MachineWideConfigDirectory);
        _settings = new Lazy<IEnumerable<Settings>>(
            () => global::NuGet.Configuration.Settings.LoadMachineWideSettings(baseDirectory));
    }

    public IEnumerable<Settings> Settings => _settings.Value;
}

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);
    }
}

public class ProjectContext : INuGetProjectContext
{
    private List<string> logs = new List<string>();

    public List<string> GetLogs()
    {
        return logs;
    }

    public void Log(MessageLevel level, string message, params object[] args)
    {
        var formattedMessage = String.Format(message, args);
        logs.Add(formattedMessage);
        // Do your logging here...
    }

    public FileConflictAction ResolveFileConflict(string message)
    {
        logs.Add(message);
        return FileConflictAction.Ignore;
    }


    public PackageExtractionContext PackageExtractionContext
    {
        get;
        set;
    }

    public NuGet.ProjectManagement.ExecutionContext ExecutionContext
    {
        get;
    }

    public XDocument OriginalPackagesConfig
    {
        get; set;
    }

    public ISourceControlManagerProvider SourceControlManagerProvider
    {
        get;
        set;
    }

    public void ReportError(string message)
    {
        logs.Add(message);
    }

    public NuGetActionType ActionType
    {
        get; set;
    }

    public TelemetryServiceHelper TelemetryService
    {
        get; set;
    }
}

希望对您有所帮助!

【讨论】:

  • 非常感谢!我已经放弃了得到任何答案的希望。不幸的是,我已经离开了我需要答案的地方,所以我(可能)无法确认这是否有效。我会将答案传递给他们,以便他们使用。
  • 好的!让我们保持这个问题的开放性以帮助他人。
  • 看起来这已经过时了 - 我无法在上面的代码中找到几个类和接口类型。有谁知道最近的一个例子?整个 Nuget v3 抽象似乎过于复杂 - 这是 v2 中的 3 行代码。
  • 抱歉拖了这么久,我没有看到这个帖子。我刚刚创建了一个更新的基本搜索脚本。该脚本正在搜索 NuGet V3 包。这是链接:github.com/yanckst/search-nuget-v3希望这有帮助!我可能会创建更多示例,例如安装、删除等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多