2017-11-30 1 views
1

Gegeben ist ein Zeichenfolgendateipfad zu einer Lösungsdatei, z. C: \ Foo.sln, wie programmierst du NuGet-Pakete programmatisch für diese Lösung? Ich habe versucht, this guide zu folgen, aber habe gefunden, dass es elend unvollständig ist.C# programmgesteuert NuGet-Pakete wiederherstellen

Nach der Installation des NuGet-Pakets NuGet.VisualStudio, wie der Artikel es empfiehlt, stolpere ich darum, Pakete wiederherzustellen.

Hier ist der Code, den ich habe bisher:

// requires reference to System.ComponentModel.Composition 
    [Import(typeof(IVsPackageRestorer))] 
    private static IVsPackageRestorer packageInstaller; 

Und dann versuchen, es zu verwenden (scheint EnvDTE Bezug auf erfordern) (und wie benutzt man diese Magie „GetService“ Methode - von woher die kommen ?):

private static void RestorePackages(string solutionPath) 
    { 
     // Using the IComponentModel service 
     // https://docs.microsoft.com/en-us/nuget/visual-studio-extensibility/nuget-api-in-visual-studio#ivspackagerestorer-interface 

     // How do I get the project? Can I do this at the solution level or do I have to get all projects under the solution? 
     EnvDTE.Project project = null; 
     packageInstaller.RestorePackages(project); 

     ////What is this code??? What is GetService??? 
     ////var componentModel = (IComponentModel)GetService(typeof(SComponentModel)); 
     ////IVsPackageRestorer packageRestorer = componentModel.GetService<IVsPackageRestorer>(); 
     ////packageRestorer.RestorePackages(project); 
    } 

Bearbeiten/Lösung: Empfehlung Matt Ward Verwendung, zu der Code „berappen“ sieht aus wie das folgende Verfahren in meinem Fall nuget.exe Pakete wiederherzustellen, basierend auf den vollständigen Pfad zu einer Lösung.

private static void RestorePackages(string solutionPath) 
{ 
    using (Process process = new Process()) 
    { 
     process.StartInfo = new ProcessStartInfo 
     { 
      FileName = "nuget.exe", 
      Arguments = $"restore {solutionPath}", 
      UseShellExecute = false, 
      CreateNoWindow = true 
     }; 

     process.Start(); 
     process.WaitForExit(); 
    } 
} 

Antwort

1

Nicht sicher, wo der Code ausgeführt wird. Es ist möglicherweise einfacher, nur NuGet.exe zu entfernen und die Lösung wiederherzustellen, anstatt zu versuchen, die Visual Studio-API zu verwenden. Die API, zu der Sie eine Verknüpfung herstellen, ist nur verfügbar, wenn Sie beispielsweise in Visual Studio als Erweiterung oder im Fenster der Package Manager-Konsole ausgeführt werden.

Wenn der Code, den Sie schreiben, nicht in Visual Studio ausgeführt wird, z. B. eine Konsolenanwendung, wird die Ausführung von nuget.exe einfacher. Andernfalls könnten Sie sich die verschiedenen verfügbaren NuGet-Pakete ansehen und eine API für verschiedene NuGet-Operationen bereitstellen. Das Ausführen von nuget.exe restore ist jedoch viel einfacher.

Verwandte Themen