В каком контексте работает MSBUILD?

Когда мы запускаем нашу сборку через MSBuild, в каком контексте запускается MSBuild?

Причина, по которой я спрашиваю, заключается в том, что у меня есть событие перед сборкой, которое вызывает программу командной строки (минификация ajax), которая отлично работает, если проект создается через VS2010 (на том же компьютере), но не работает, когда наша система сборки (CCNet ) строит это. Я получаю ошибку 9009, что означает, что он не может найти файл. Программа командной строки имеет путь к среде, установленный для ее местоположения (путь к среде задается через setx, возможно, он установлен только для текущего пользователя?), Поэтому вызов только его имени отлично работает во всех случаях, кроме случаев, когда CCNet вызывает MSBuild.


person BlueChameleon    schedule 12.02.2013    source источник
comment
Событие предварительной сборки выполняется классом MSBuild Exec. Которая запускает команды в скрытом экземпляре cmd.exe. Рабочий каталог устанавливается в выходной каталог проекта, исходная среда наследуется от родительского процесса. Не используйте SETX, это не изменит среду. Используйте SET. Используйте PATH, чтобы изменить путь.   -  person Hans Passant    schedule 13.02.2013
comment
Вы можете объяснить, где мне использовать SET PATH? Я использовал SETX один раз после того, как установил программу минификации ajax. Как мне использовать SET PATH в событии перед сборкой?   -  person BlueChameleon    schedule 13.02.2013
comment
Просто поместите его в событие перед сборкой: set path = c: \ foo \ bar;% path%.   -  person Hans Passant    schedule 13.02.2013
comment
Просто попробовал, и он работает. Единственная проблема заключается в том, что я жестко запрограммировал путь в моих файлах проекта. Есть ли способ установить путь и выбрать путь из глобальных переменных пути среды, которые уже существуют (те, которые были установлены SETX ранее)   -  person BlueChameleon    schedule 13.02.2013
comment
У меня заканчиваются идеи, как сказать вам прекратить использовать SETX. Он обновляет реестр, а не среду.   -  person Hans Passant    schedule 13.02.2013
comment
Тогда как я могу установить путь к среде один раз после установки JS minifer? Я не хочу жестко указывать этот путь в своих событиях сборки, я просто хочу вызвать jsmin.exe из события сборки, и он должен знать (из среды), где его найти. Насколько я понимаю, SET PATH предназначен только для текущего процесса. После завершения процесса путь к среде исчезает.   -  person BlueChameleon    schedule 13.02.2013


Ответы (1)


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

Когда вы запускаете msbuild через Visual Studio, он запускается от вашего имени, потому что в вашем контексте входа была запущена Visual Studio, которая, в свою очередь, выполнила сборку.

Если вы запустите его через какую-нибудь службу сборки, ответ будет зависеть от того, как эта служба сборки работает. TFS Build, например, запускает MSBuild от имени любого пользователя, которого вы настроили для учетных данных для входа в службу TFS Build. Если вы настроили CC.NET для работы в качестве службы, вам также необходимо указать, от имени какого пользователя он работает. Вот под кем также будет работать MSBuild.

Если вам нужна определенная среда, настроенная для сборки, у вас есть несколько вариантов. Самый простой, хотя и очень похожий на подход «гигантского молотка», - это глобальная настройка среды на машине сборки для всех пользователей. Другие варианты включают выполнение какого-либо шага предварительной настройки в вашей сборке или запись командного файла запуска для запуска службы вручную после настройки среды.

person Michael Edenfield    schedule 12.02.2013