2017-06-08 1 views
3

Hintergrund

Ich schreibe eine .NET Core Befehlszeilenanwendung als CLI für mein Build-System. Dieser Teil des Build-Systems beinhaltet das Erzeugen eines NuGet-Pakets aus einer Klassenbibliothek. Ich benutze ProcessStartInfo.cs und Process.cs, um einen Anruf an nuget.exe zu machen, um den Paketbefehl auszugeben (nuget.exe Position ist im System PATH)..Net Core Befehlszeile App | Process.Start() läuft auf einigen Maschinen, aber nicht auf anderen

  • . HINWEIS: Ich kann nicht Dotnet CLI für die Verpackung als die Klassenbibliothek ist kein .NET Core-Projekt, verwenden Sie also bitte nicht sagen: „Warum gehst du nicht einfach dotnet pack verwenden

Stapel

  • C# .NET-Core (My CLI)
  • C# .NET 4.5 (Class Library)
  • Thought GoCD (Build Server)
  • Windows Server 2016 (Build Server OS)
  • Windows-10 (Local Machine OS)

Problem

Die Frage, die ich bin vor, dass Wenn ich mein Build-System CLI auf meinem persönlichen Computer starte, funktioniert alles einwandfrei. Wenn mein Build-Server es jedoch ausführt, scheint der Prozess zu starten, wird dann jedoch beendet, ohne eine Ausnahme auszulösen oder einen beliebigen Beendigungscode zurückzugeben. Beide Konten (Ich auf meinem lokalen Computer und das Konto, unter dem der Build-Server ausgeführt wird) sind lokale Administratorkonten.


-Code

Cmd.cs (Führt Prozess)

public static class Cmd 
{ 
    public static int Execute(string filename, string arguments) 
    { 
     var startInfo = new ProcessStartInfo 
     { 
      CreateNoWindow = true, 
      FileName = filename, 
      Arguments = arguments, 
     }; 

     using (var process = new Process { StartInfo = startInfo }) 
     { 
      try 
      { 
       process.Start(); 
       process.WaitForExit(30000); 
       return process.ExitCode; 
      } 

      catch (Exception exception) 
      { 
       if (!process.HasExited) 
       { 
        process.Kill(); 
       } 

       Console.WriteLine($"Cmd could not execute command {filename} {arguments}:\n{exception.Message}"); 
       return (int)ExitCode.Exception; 
      } 
     } 
    } 
} 

Package.cs (verwendet Cmd.cs)

// Some code before this 

// The below three variables are generated/provided and are made up here for show 
var version = "1.0.0"; 
var package = $"MyLib.{version}"; 
var projectPath = "C:\Some\Made\Up\Path"; 
/////////// 

// Real code 
var tempPath = $"{Path.Combine(Path.GetTempPath(), "NugetPackages")}"; 
var packagePath = Path.Combine(tempPath, package); 

if (!Directory.Exists(tempPath)) 
{ 
    try 
    { 
     Directory.CreateDirectory(tempPath); 
    } 

    catch (Exception exception) 
    { 
     Console.WriteLine($"Could not create directory in user temp file: {exception.Message}"); 
     return (int) ExitCode.FilePermission; 
    } 
} 

var filename = "nuget.exe"; 
var arguments = $"pack -Version {version} -OutputDirectory {tempPath} -properties Configuration=Release {projectPath}"; 
var exitCode = Cmd.Execute(filename, arguments); 

if (exitCode != 0) 
{ 
    Console.WriteLine($"Process failed to execute and exited with exit code: {exitCode}"); 
    return exitCode; 
} 

Console.WriteLine($"{package} built successfully"); 

// Some code after this 
+1

Sie müssen verwenden, um die nuget.exe Ausgabe erhalten auf Fehler überprüfen, wie Sie hidding sind das Prozessfenster Sie umleiten sollte StandardOutput und lies die Ergebnisse.Außerdem kann der Prozess mehr als 30 Sekunden dauern und Sie warten nicht darauf, das Zeitlimit von WaitForExit zu debuggen. – Gusman

+0

Guter Punkt, habe ich einen Blick und es scheint, dass die gleiche Version von NuGet.exe verhält sich anders auf Windows 10 Pro vs Windows Server 2016 ... nicht sicher, warum, aber unter Windows 10 Pro kann ich die -Version-Tag zu ersetzen das Token $ version $ in der .nuspec, aber in Windows Server 2016 kann ich das nicht tun und muss ein neues Token erstellen (zB $ package $) und den Parameter -properties verwenden, um $ package $ durch meine Version zu ersetzen ... lahme Soße! –

Antwort

1

ich meinen Code geändert um alle Fensterausgaben anzuzeigen und es erscheint t Hat die gleiche Version von NuGet.exe verhält sich anders auf Windows 10 Pro vs Windows Server 2016 ... nicht sicher, warum, aber unter Windows 10 Pro kann ich die -Version-Tag verwenden, um die $ Version $ Token in der .Nuspec zu ersetzen, aber In Windows Server 2016 kann ich dies nicht tun und muss ein anderes Token verwenden (z. B. $ package $) und benutze die Option -properties, um $ package $ durch meine Version ... lahme Sauce zu ersetzen!

Anstatt also:

nuget.exe pack -Version 1.0.0 -OutputDirectory C:\Somewhere -properties Configuration=Release MyLib 

habe ich

nuget.exe pack -OutputDirectory C:\Somwhere -properties "Configuration=Release;package=1.0.0" MyLib 
Verwandte Themen