2017-06-08 9 views
3

背景

ビルドシステムのCLIとして.NET Core Command Lineアプリケーションを作成しています。ビルドシステムのこの部分では、クラスライブラリからNuGetパッケージを生成します。 ProcessStartInfo.csProcess.csを使用してnuget.exeを呼び出し、packコマンド(nuget.exeの場所はシステムPATHにあります)を発行しています。.Net Coreコマンドラインアプリ| Process.Start()はいくつかのマシンで動作しますが、他のマシンでは動作しません。

  • 注:クラスライブラリは、.NETのコア事業ではないと私はなぜあなただ​​けdotnet packを使用していない」と言うしないでください、包装用DOTNETのCLIを使用することはできません

スタック

  • C#.NETのコア(マイCLI)
  • C#.NET 4.5(クラスライブラリ)
  • ThoughtWorksのGoCD(サーバの構築)
  • のWindows Server 2016(サーバーOSの構築)
  • のWindows 10(ローカルマシンのOS)

問題

は、私が直面しています問題があることです私の個人的なマシンで、ビルドシステムのCLIを実行すると、すべて正常に動作します。しかし、私のビルドサーバーがそれを実行すると、プロセスは開始しようとしているように見えますが、例外を投げたり、終了コードを返すことなく終了します。両方のアカウント(ローカルマシンのMeとビルドサーバーが実行するアカウント)はローカル管理者アカウントです。コード

Cmd.cs(実行プロセス)

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


は、私は自分のコードを修正

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

を使用する必要がありますStandardOutputと結果を読み込みます。また、プロセスが30秒以上かかることがあり、WaitForExitのタイムアウトをデバッグするために待機していない可能性があります。 – Gusman

+0

良い点、私は見て、それは同じバージョンのNuGet.exeがWindows 10 ProとWindows Server 2016で動作が異なるように見えます。なぜか分かりませんが、Windows 10 Proでは-Versionタグを使用して置き換えることができます.nu​​specの$ version $トークンをWindows Server 2016で実行することはできません。新しいパッケージを$ package $と置き換えるために、新しいパッケージを作成して-propertiesスイッチを使用する必要があります。ラメソース! –

答えて

1

(Cmd.csを使用しています)すべてのウィンドウ出力を表示すると、tと表示されます帽子NuGet.exeの同じバージョンは、Windows 10 ProとWindows Server 2016の動作が異なります。理由はわかりませんが、Windows 10 Proでは.Versionタグを使用して.nuspecの$ version $トークンを置き換えることができますWindows Server 2016では、これを行うことはできず、別のトークンを使用する必要があります(例: $ package $)を置き換え、-propertiesスイッチを使って$ package $を私のバージョンの... lame sauceに置き換えてください!

ので、代わりに:

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

私はあなたがリダイレクトする必要があり、プロセス・ウィンドウhiddingあるとしてあなたは、エラーをチェックするためにnuget.exe出力を取得する必要があり

nuget.exe pack -OutputDirectory C:\Somwhere -properties "Configuration=Release;package=1.0.0" MyLib 
関連する問題