Visual Studio扩展- NuGet安装/卸载后的事件

本文关键字:卸载 事件 安装 Studio 扩展 NuGet Visual | 更新日期: 2023-09-27 18:16:55

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

Visual Studio扩展- NuGet安装/卸载后的事件

可以像下面的代码一样简单。一定要使用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]));
                }
            }
        };
    }

你可以在Visual Studio中使用NuGet API并监听NuGet事件,如PackageInstalling或PackageInstalled。但要确保在批处理模式下使用这些事件,并从NuGet IVsPackageInstallerProjectEvents接口侦听BatchStart和BatchEnd,这样它就不会降低NuGet的性能。

你可以在NuGet博客上找到更多关于这些api的细节。

所以理想情况下,当你收到BatchStart事件时,你将坚持执行IVsPackageInstallerEvents事件,如PackageInstalling, PackageInstalled等,并在你收到BatchEnd事件后应用这些。