gpt4 book ai didi

c# - .Net 核心命令行应用 | Process.Start() 在某些机器上运行,但在其他机器上不运行

转载 作者:可可西里 更新时间:2023-11-01 14:22:47 27 4
gpt4 key购买 nike

背景

我正在为我的构建系统编写一个 .NET Core 命令行应用程序作为 CLI。构建系统的这一部分涉及从类库生成 NuGet 包。我正在使用 ProcessStartInfo.csProcess.cs 调用 nuget.exe 以发出打包命令 (nuget. exe 位置在系统 PATH 中)。

  • 注意:我不能使用 dotnet CLI 进行打包,因为类库不是 .NET Core 项目,所以请不要说“你为什么不直接使用 dotnet pack。<

堆栈

  • C# .NET 核心(我的 CLI)
  • C# .NET 4.5(类库)
  • Thoughtworks GoCD(构建服务器)
  • Windows Server 2016(构建服务器操作系统)
  • Windows 10(本地计算机操作系统)

问题

我面临的问题是,在我的个人机器上,当我运行我的构建系统 CLI 时,一切都运行良好;然而,当我的构建服务器运行它时,该进程似乎试图启动,但随后退出而没有抛出异常或返回任何类型的退出代码。这两个帐户(本地计算机上的我和运行构建服务器的帐户)都是本地管理员帐户。


代码

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(使用 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

最佳答案

我修改了我的代码以显示所有窗口输出,看起来相同版本的 NuGet.exe 在 Windows 10 Pro 和 Windows Server 2016 上的行为不同......不知道为什么,但在 Windows 10 Pro 上我可以使用 -用于替换 .nuspec 中的 $version$ 标记的版本标记,但在 Windows Server 2016 中,我无法执行此操作并且必须使用不同的标记(例如 $package$)并使用 -properties 开关将 $package$ 替换为我的版本……蹩脚酱!

所以,而不是:

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

我必须使用

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

关于c# - .Net 核心命令行应用 | Process.Start() 在某些机器上运行,但在其他机器上不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44445018/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com