#msbuild #windows-services
#msbuild #windows-services
Вопрос:
Я пытаюсь запустить этот пакетный файл из службы Windows (запущенной от имени моего собственного пользователя), и msbuild не работает. Однако прямой запуск работает. Я получаю сообщение «дескриптор недействителен» в stderr из, я полагаю, vcvarsall.bat.
rem Load compilation environment
call "C:Program Files (x86)Microsoft Visual Studio 10.0VCvcvarsall.bat"
rem Load the All Solutions.sln program
msbuild "C:AutoBuildCheckoutOther ProjectsAll ProjectsAll Projects.sln"
pause
Я в замешательстве. У кого-нибудь есть какие-либо предложения?
-Исаак
Ответ №1:
Службы в Windows Vista и выше выполняются на отдельном рабочем столе и, следовательно, не имеют доступа к stdin
, stdout
, и stderr
. (Службы больше не могут «взаимодействовать с рабочим столом»; вы заметите, что эта опция отсутствует в апплете служб на панели управления.)
РЕДАКТИРОВАТЬ: после комментариев ниже… Служба IMO — неправильное решение. Существуют продукты непрерывной интеграции, которые управляют этим за вас, такие как Hudson или CruiseControl; Я уверен, что есть много других. См. Также Непрерывная интеграция в Википедии для получения дополнительной информации.
Комментарии:
1. Я могу получить стандартную ошибку и вывести ее с помощью Process. StartInfo.RedirectStandardOutput, а затем прочитать его с помощью StreamReader. В любом случае, у меня есть файл основного решения, в котором в конечном итоге будет несколько десятков проектов, каждый из которых зависит от некоторых проектов базовой библиотеки. Я использую скрипт перехвата после фиксации для отправки команды службе, чтобы попытаться создать основное решение. Затем, если код выхода из пакетного файла не равен нулю, я отправляю сообщение об ошибке и электронное письмо тому, кто нарушил сборку.
2. Я изначально выбрал службу, чтобы одновременно могла выполняться только одна сборка. Я также хочу использовать эту службу для автоматического запуска наборов тестов когда-нибудь.
3. Возможно, вы сможете подключиться к стандартному интерфейсу stdin и стандартному выходу, но вы этого не делаете cmd.exe , который использует ваш пакетный файл. Ваши причины также не имеют смысла для меня; выполнение сборки через службу не предотвращает выполнение более одной сборки, и есть другие способы автоматического запуска наборов тестов. Вы должны смотреть на события до и после сборки в MSBuild (например, post build может автоматически запускать тесты). Служба кажется мне совершенно неуместной, но это только мое мнение, и вы знаете, чего они стоят. 🙂
4. Чтобы уточнить: возможно, вы получаете дескрипторы stdin и stdout, но они не являются дескрипторами пользовательского рабочего стола, что cmd.exe используется для вывода; вот почему вы получаете ошибки из пакетного файла. Служба запускается на полностью отдельном рабочем столе от вошедшего в систему пользователя.
5. извините, я, вероятно, неясен. Служба запущена на сервере subversion. когда кто-то передает что-то на сервер, эта служба должна проверить, чтобы убедиться, что то, что они совершили, не нарушает сборку. Когда-нибудь он также проверит, что все тесты все еще выполняются, возможно, каждую ночь.
Ответ №2:
Мое решение состояло в том, чтобы просто не вызывать vcvarsall.bat. Вместо этого я напрямую вызываю msbuild оттуда, где он находится в каталоге Windows. Итак, я обошел проблему, толком не зная решения.