从.NET Windows服务运行Rake

3
我是horn开源项目的开发人员,旨在简化构建其他开源项目的痛苦。我们试图使horn成为类似于Ruby gems的体验。horn的许多挑战之一是必须处理各种构建引擎,如Nant、PowerShell、msbuild和rake,这就是本文的重点。
Horn有两种形式,它作为一个命令行工具运行,也作为一个Windows服务运行,在其中构建可以从this网站下载的各种软件包。
某些开源项目使用rake构建其源代码,这最终带我到了本文的重点。
当从命令行运行时,我无法从Windows服务中运行rake进程,而完全相同的代码可以启动rake进程而不会出现任何问题。rake能够从cmd行工具中运行的原因可能是因为它与窗口相关联,尽管我不能确切地说。没有抛出异常,但进程只是不启动。
有趣的是,每个其他的.exe都正常工作,只有rake引起问题。
这里是启动创建进程的代码:
public IProcess GetProcess(string pathToBuildTool, string cmdLineArguments, string workingDirectoryPath)
{
    var psi = new ProcessStartInfo(pathToBuildTool, cmdLineArguments)
                  {
                      UseShellExecute = false,
                      RedirectStandardOutput = true,
                      WorkingDirectory = workingDirectoryPath,
                      Arguments = cmdLineArguments
                  };

    return new DiagnosticsProcess(Process.Start(psi));
}

有人对问题有什么建议吗?

2个回答

2
我自己进行了编译和调查。
在我的电脑上,Horn服务实际上启动了一个Ruby进程来运行Rake,但该进程立即退出并显示错误。我使用进程监视器来监视进程创建过程,同时过滤包含“ruby”路径的内容。最终结果是Horn无法构建Rakefile。
经过更多的调查,我对Horn如何创建构建过程进行了一些尝试。我发现,当我不仅重定向StandardOutput而且重定向StandardError时,构建实际上在我的机器上运行。
public IProcess GetProcess(string pathToBuildTool, string cmdLineArguments, string workingDirectoryPath)
{
    var psi = new ProcessStartInfo(pathToBuildTool, cmdLineArguments)
                  {
                      UseShellExecute = false,
                      RedirectStandardOutput = true,
                      RedirectStandardError = true,
                      WorkingDirectory = workingDirectoryPath,
                      Arguments = cmdLineArguments
                  };

    return new DiagnosticsProcess(Process.Start(psi));
}

我还修改了DiagnosticProcess,使其同时输出StandardOutputStandardError中的信息:

public string GetLineOrOutput()
{
    return process.StandardOutput.ReadLine() ?? process.StandardError.ReadLine();
}

净结果是以下行是Horn服务日志中的最后一条消息:
HORN HAS FINISHED INSTALLING mspec.

0

显然,在Windows上应该通过提供的批处理文件(通常是c:\ruby\bin\rake.bat)来调用Rake,而不是直接运行.EXE文件。有关详细信息,请参见Instant Badger: Rake gotcha on Windows

如果切换到使用提供的批处理文件无法解决问题,请告诉我,我会下载horn源代码并仔细查看。


不中奖伙计,但感谢你的回答。如果您正在查看源代码,则在horn.services.sln中,install_package_service.bat将安装它。当启动时,我已将调试器设置为在适当位置打开。 - dagda1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接