Запуск Rake из службы Windows .NET

Я разработчик проекта OSS horn, целью которого является облегчить создание других ОСС проектов. Мы пытаемся превратить рог в рубиновый драгоценный камень, подобный опыту. Одной из многих проблем horn является необходимость иметь дело со всеми различными механизмами сборки, такими как Nant, powershell, msbuild и rake, о чем и идет речь в этом посте.

У Horn есть 2 варианта исполнения: он работает как инструмент командной строки, а также работает как служба Windows, где он создает все различные пакеты, которые можно загрузить с этот веб-сайт.

Некоторые проекты OSS используют rake для создания своего исходного кода, что в конечном итоге привело меня к теме этого поста.

Я не могу запустить процесс rake из службы Windows, в то время как точно такой же код может запускать процесс rake без каких-либо проблем при запуске из командной строки. Причина, по которой rake запускается из инструмента строки cmd, может заключаться в том, что он связан с окном, хотя я не могу правильно сказать. Исключение не выдается, но процесс просто не запускается.

Самое смешное, что любой другой .exe работает нормально, и проблема только в грабли.

Вот код для запуска, который создает процесс:

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));
}

Есть ли у кого-нибудь предложения, в чем проблема?


person dagda1    schedule 04.12.2009    source источник


Ответы (2)


Я собирал и исследовал немного сам.

На моей машине служба Horn фактически запускает процесс Ruby для запуска Rake, но процесс немедленно завершается с ошибкой. Я использовал Process Monitor для мониторинга создания процесса при фильтрации пути, содержащего «ruby». Конечным результатом является то, что Хорн не смог построить с помощью Rakefile.

После еще нескольких исследований я немного поиграл с тем, как Хорн создает процессы сборки. Я обнаружил, что сборка фактически запускается на моей машине, когда я перенаправляю не только 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, чтобы вывести оба сообщения из StandardOutput и StandardError:

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

Конечным результатом является следующая строка, являющаяся последним сообщением в журнале службы Horn:

HORN HAS FINISHED INSTALLING mspec.
person Alexander Groß    schedule 05.12.2009

По-видимому, Rake в Windows следует запускать с помощью прилагаемого командного файла (обычно c:\ruby\bin\rake.bat), а не напрямую запускать .EXE. Дополнительные сведения см. в разделе Instant Badger: Rake gotcha в Windows. .

Если переключение на использование прилагаемого командного файла не решит проблему, сообщите мне об этом, и я проверю источник звукового сигнала и посмотрю поближе.

person Duncan Bayne    schedule 04.12.2009
comment
Нет сигарного приятеля, но спасибо за ответ. Если вы смотрите на источник, он находится в файле horn.services.sln, и его установит install_package_service.bat. У меня установлен отладчик, который запускается в соответствующем месте при запуске. - person dagda1; 05.12.2009