Visual Studio 扩展 - NuGet 之后的事件 install/uninstall?
Visual Studio Extension - Event after NuGet install/uninstall?
我正在开发 Visual Studio 扩展,我想在 NuGet 安装或卸载后执行一些逻辑。有没有我可以为此监控的事件?我已经在 IVsHierarchy 界面中尝试了 OnItemAdded 和 OnItemDeleted,但这里的问题是,由于要添加到解决方案或从解决方案中删除的文件数量,它将每 install/uninstall 执行多次。我想在 NuGet 进程完成后触发事件。
您可以在 Visual Studio 中使用 NuGet API 并监听 PackageInstalling 或 PackageInstalled 等 NuGet 事件。但请确保以批处理模式使用这些事件,并从 NuGet IVsPackageInstallerProjectEvents 接口监听 BatchStart 和 BatchEnd,这样它就不会降低 NuGet 性能。
您可以在 NuGet 博文中找到有关这些 API here 的更多详细信息。
因此,理想情况下,当您收到 BatchStart 事件时,您将继续执行 IVsPackageInstallerEvents 事件,如 PackageInstalling、PackageInstalled 等,并在收到 BatchEnd 事件后应用这些事件。
它可以像下面的代码一样简单。只需确保使用 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 安装或卸载后执行一些逻辑。有没有我可以为此监控的事件?我已经在 IVsHierarchy 界面中尝试了 OnItemAdded 和 OnItemDeleted,但这里的问题是,由于要添加到解决方案或从解决方案中删除的文件数量,它将每 install/uninstall 执行多次。我想在 NuGet 进程完成后触发事件。
您可以在 Visual Studio 中使用 NuGet API 并监听 PackageInstalling 或 PackageInstalled 等 NuGet 事件。但请确保以批处理模式使用这些事件,并从 NuGet IVsPackageInstallerProjectEvents 接口监听 BatchStart 和 BatchEnd,这样它就不会降低 NuGet 性能。
您可以在 NuGet 博文中找到有关这些 API here 的更多详细信息。
因此,理想情况下,当您收到 BatchStart 事件时,您将继续执行 IVsPackageInstallerEvents 事件,如 PackageInstalling、PackageInstalled 等,并在收到 BatchEnd 事件后应用这些事件。
它可以像下面的代码一样简单。只需确保使用 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]));
}
}
};
}