2009-12-04 3 views
3

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

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

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

Я не могу заставить процесс грабли работать из службы windows, а тот же самый код может запустить процесс грабли без каких-либо проблем при запуске из командной строки. Причина, по которой 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

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

На моей машине служба 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 HAS FINISHED INSTALLING mspec. 
0

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

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

+0

Никакой приятель сигар, но спасибо за ответ. Если вы смотрите на источник, то он находится в файле horn.services.sln, и install_package_service.bat установит его. У меня есть отладчик, который запускается в соответствующем месте при его запуске. – dagda1

Смежные вопросы