Запуск Rake из службы Windows .NET - PullRequest
3 голосов
/ 05 декабря 2009

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

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

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

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

Самое смешное, что все остальные .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));
}

У кого-нибудь есть какие-либо предложения относительно проблемы?

Ответы [ 2 ]

2 голосов
/ 05 декабря 2009

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

На моем компьютере служба 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.
0 голосов
/ 05 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...