Стартиране на Rake от .NET windows услуга

Аз съм разработчик на проекта horn OSS, който има за цел да облекчи болката от изграждането на други OSS проекти. Ние се опитваме да направим рога рубинени скъпоценни камъни като опит. Едно от многото предизвикателства на horn е да се справяте с всички различни машини за изграждане като Nant, powershell, msbuild и rake, което е целта на тази публикация.

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

Някои OSS проекти използват rake, за да изградят изходния си код, което в крайна сметка ме доведе до точката на тази публикация.

Не мога да накарам процеса на рейк да се изпълнява от услугата 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));
}

Някой има ли предложения какъв е проблемът?


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


Отговори (2)


Сам съставих и проучих малко.

На моята машина услугата Horn всъщност стартира Ruby процес, за да стартира Rake, но процесът излиза веднага с грешка. Използвах Process Monitor, за да наблюдавам създаването на процес, докато филтрирах за пътя, съдържащ "ruby". Крайният резултат е, че Horn не успя да изгради с 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