0

私はVisual Studioエクステンションを開発しています.NuGetのインストールまたはアンインストール後にいくつかのロジックを実行したいと思います。私がこれを監視できるイベントはありますか?私はIVsHierarchyインターフェイスでOnItemAddedとOnItemDeletedを試しましたが、ここでの問題は、ソリューションに追加または削除されるファイルの数のためにインストール/アンインストールごとに何度も実行されるということです。 NuGetプロセスが完了した後でイベントをトリガーしたいと思います。Visual Studio Extension - NuGetのインストール/アンインストール後のイベント?

+1

このようなイベントで何をしようとしていますか?すなわち、そのような出来事があったと想像してください、あなたはそれを何のために使うつもりですか? –

+0

私は、ソリューションで利用されているパッケージに関する特定のメタデータを収集し、その情報をツールウィンドウに表示したいと考えています。私はもちろん、ボタンをクリックしてユーザーが手動でロジックを呼び出させるようにしても構いませんが、バックグラウンドでそれを実行する方法があることを期待していました。 – bgeveritt

答えて

1

Visual StudioでNuGet APIを使用して、PackageInstallingやPackageInstalledのようなNuGetイベントを聴くことができます。しかし、これらのイベントをバッチモードで使用し、NuGet IVsPackageInstallerProjectEventsインターフェイスからBatchStartとBatchEndを受信し、NuGetのパフォーマンスを低下させないようにしてください。

これらのAPIの詳細については、hereでNuGet blogpostをご覧ください。

BatchStartイベントを受信すると、PackageInstalling、PackageInstalledなどのIVsPackageInstallerEventsイベントを実行し、BatchEndイベントを受信した後にこれらイベントを適用することが理想的です。

+0

Aashish - 例としていくつかのコードを提供できる方法はありますか?私は実際にこれを適切に結びつけるために苦労している。ありがとう! – bgeveritt

2

これは次のコードと同じくらい簡単です。 NuGet.VisualStudio最新パッケージ(v4.0.0-rc3-2137)を入手するには、https://dotnet.myget.org/F/nuget-build/api/v3/index.jsonをNuget Feedとして必ず使用してください。

[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])); 
       } 
      } 
     }; 
    } 
関連する問題