0

Я разрабатываю расширение Visual Studio, и я хотел бы выполнить некоторую логику после установки или удаления NuGet. Есть ли событие, которое я могу контролировать для этого? Я пробовал OnItemAdded и OnItemDeleted в интерфейсе IVsHierarchy, но проблема в том, что он будет выполняться много раз за установку/удаление из-за количества файлов, которые добавляются или удаляются в решение. Я хочу запустить событие после завершения процесса NuGet.Visual Studio Extension - событие после установки или удаления NuGet?

+1

Что вы хотите сделать с таким событием? т. е. представьте, что было такое событие, для чего вы собираетесь его использовать? –

+0

Я хотел бы собрать определенные метаданные о пакетах, которые используются в решении, и представить эту информацию в окне инструмента. Я могу, конечно, сделать это, попросив пользователя вручную вызвать логику нажатием кнопки, но я надеялся, что есть возможность также выполнить ее за кулисами. – bgeveritt

ответ

1

Вы можете использовать API NuGet в Visual Studio и слушать события NuGet, такие как PackageInstalling или PackageInstalled. Но убедитесь, что вы используете эти события в пакетном режиме, а также прослушиваете BatchStart и BatchEnd из интерфейса NuGet IVsPackageInstallerProjectEvents, чтобы он не ухудшал производительность NuGet.

Подробнее об этих API-интерфейсах here можно найти на блоге NuGet.

В идеале, когда вы получаете событие BatchStart, вы будете продолжать выполнять события IVsPackageInstallerEvents, такие как PackageInstalling, PackageInstalled и т. Д. И применять их после получения события BatchEnd.

+0

Aashish - можно ли каким-то образом предоставить код в качестве примера? Я изо всех сил пытаюсь добиться этого. Благодаря! – bgeveritt

2

Это может быть так просто, как указано ниже. Просто не забудьте использовать 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])); 
       } 
      } 
     }; 
    } 
Смежные вопросы