【问题标题】:Visual Studio Extension - Event after NuGet install/uninstall?Visual Studio 扩展 - NuGet 安装/卸载后的事件?
【发布时间】:2016-11-08 02:30:01
【问题描述】:

我正在开发一个 Visual Studio 扩展,我想在安装或卸载 NuGet 后执行一些逻辑。有没有我可以监控的事件?我已经在 IVsHierarchy 界面中尝试了 OnItemAdded 和 OnItemDeleted,但这里的问题是由于添加或删除到解决方案中的文件数量,每次安装/卸载它都会执行多次。我想在 NuGet 过程完成后触发事件。

【问题讨论】:

  • 想对这样的事件做什么?即想象有这样的事件,你打算用它做什么?
  • 我想收集有关解决方案中使用的包的某些元数据,并在工具窗口中显示该信息。我当然可以通过让用户通过单击按钮手动调用逻辑来做到这一点,但我希望有一种方法可以在幕后执行它。

标签: c# visual-studio visual-studio-extensions vs-extensibility


【解决方案1】:

它可以像下面的代码一样简单。只需确保使用https://dotnet.myget.org/F/nuget-build/api/v3/index.json 作为 Nuget Feed 即可获取 NuGet.VisualStudio 最新包 (v4.0.0-rc3-2137)。

    [Import]
    private IVsPackageInstallerEvents packageInstallerEvents;

    [Import]
    private IVsPackageInstallerProjectEvents packageInstallerProjectEvents;

    private string currentBatchId;

    private Dictionary<string, string> packagesMetadata;

    public void BindNuGetPackageEvents()
    {
        packageInstallerProjectEvents.BatchStart += (projectMetadata) =>
        {
            // preserve current batch id or project name to compare with batch end event
            currentBatchId = projectMetadata.BatchId;
            Console.WriteLine("Current Project Name : " + projectMetadata.ProjectName);
        };

        packageInstallerEvents.PackageInstalled += (metadata) =>
        {
            // package being insalled in current project
            // Save package metadata to use at batch end event
            packagesMetadata.Add(metadata.Id, "installed");
        };

        packageInstallerEvents.PackageUninstalled += (metadata) =>
        {
            // package being uninstalled in current project
            // Save package metadata to use at batch end event
            packagesMetadata.Add(metadata.Id, "uninstalled");
        };

        packageInstallerProjectEvents.BatchEnd += (projectMetadata) =>
        {
            if (currentBatchId == projectMetadata.BatchId)
            {
                // Now you can use your packages metadata saved during packageinstalled or packageuninstalled events
                foreach (var packageName in packagesMetadata.Keys)
                {
                    Console.WriteLine(string.Format("Package {0} was {1}", packageName, packagesMetadata[packageName]));
                }
            }
        };
    }

【讨论】:

    【解决方案2】:

    您可以在 Visual Studio 中使用 NuGet API 并监听 NuGet 事件,例如 PackageInstalling 或 PackageInstalled。但请确保您在批处理模式下使用这些事件,并从 NuGet IVsPackageInstallerProjectEvents 接口监听 BatchStart 和 BatchEnd,以免降低 NuGet 性能。

    您可以在 NuGet 博文中找到有关这些 API here 的更多详细信息。

    因此,理想情况下,当您收到 BatchStart 事件时,您将继续执行 IVsPackageInstallerEvents 事件,如 PackageInstalling、PackageInstalled 等,并在收到 BatchEnd 事件后应用这些事件。

    【讨论】:

    • Aashish - 有什么方法可以提供一些代码作为示例吗?我正在努力真正把它正确连接起来。谢谢!
    猜你喜欢
    • 2012-04-05
    • 2012-04-11
    • 1970-01-01
    • 2019-09-04
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多