背景
ビルドシステムのCLIとして.NET Core Command Lineアプリケーションを作成しています。ビルドシステムのこの部分では、クラスライブラリからNuGetパッケージを生成します。 ProcessStartInfo.cs
とProcess.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
を使用する必要がありますStandardOutputと結果を読み込みます。また、プロセスが30秒以上かかることがあり、WaitForExitのタイムアウトをデバッグするために待機していない可能性があります。 – Gusman
良い点、私は見て、それは同じバージョンのNuGet.exeがWindows 10 ProとWindows Server 2016で動作が異なるように見えます。なぜか分かりませんが、Windows 10 Proでは-Versionタグを使用して置き換えることができます.nuspecの$ version $トークンをWindows Server 2016で実行することはできません。新しいパッケージを$ package $と置き換えるために、新しいパッケージを作成して-propertiesスイッチを使用する必要があります。ラメソース! –