c # - .Net Core Command Line App | Process.Start () kører på nogle maskiner, men ikke andre

Indlæg af Hanne Mølgaard Plasc

Problem



Baggrund



Jeg skriver en .NET Core Command Line Application som et CLI til mit build system. Denne del af bygningssystemet indebærer at generere en NuGet-pakke fra et klassebibliotek. Jeg bruger ProcessStartInfo.cs og Process.cs for at ringe til nuget.exe for at udstede pakke-kommandoen (nuget.exe placering er i systemet PATH).



  • BEMÆRK: Jeg kan ikke bruge dotnet CLI til emballagen, da klassebiblioteket ikke er et .NET Core-projekt, så vær så venlig at ikke sige 'Hvorfor bruger du bare dotnet pack.






Stak




  • C # .NET Core (My CLI)

  • C # .NET 4.5 (Klassebibliotek)

  • Thoughtworks GoCD (Build Server)

  • Windows Server 2016 (Build Server OS)

  • Windows 10 (Local Machine OS)






Problem



Det problem, jeg står over for, er at på min personlige maskine, når jeg kører mit build system CLI, virker alt perfekt fint; Men når min build-server kører den, ser processen ud til at forsøge at starte, men går ud uden at kaste en undtagelse eller returnerer nogen form for exitkode. Begge konti (jeg på min lokale maskine og den konto, som byggeserveren kører under) er lokale adminkonti.





Kode



Cmd.cs (Udfører proces)


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}:
{exception.Message}");
                return (int)ExitCode.Exception;
            }
        }
    }
}


Package.cs (bruger 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:SomeMadeUpPath";
///////////

// 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

Bedste reference


Jeg ændrede min kode for at vise alle vinduets output og det ser ud til, at den samme version af NuGet.exe opfører sig anderledes på Windows 10 Pro versus Windows Server 2016 ... ikke sikker på hvorfor, men på Windows 10 Pro kan jeg bruge -Version-tagget til Udskift $ version $ token i .nuspec, men i Windows Server 2016 kan jeg ikke gøre dette og skal bruge et andet token (f.eks. $ pakke $) og brug -percentrene skifte til at erstatte $ pakke $ med min version .. . lamme sauce!


Så i stedet for:


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


Jeg skal bruge


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