2016-07-14 4 views
3

Я работаю над автоматизацией процесса сборки и развертывания нашего программного обеспечения. Одной из основных составляющих этого является выполнение msbuild для компиляции нескольких проектов Delphi.Как выполнить MSBuild из Delphi?

После многочисленных ресурсов such as this one, я могу сделать это успешно из командной строки RAD Studio (которая просто вызывает rsvars.bat для установки некоторых переменных среды). Однако при попытке автоматизировать как этот командный файл, так и команду msbuild из Delphi я не могу понять, как действовать.

Ключом к выпуску является то, что командный файл и фактическая команда msbuild представляют собой две совершенно отдельные команды - хотя их нужно запускать вместе в одной и той же среде. Я нашел this question несколько связанный, но я не вижу ясного ответа для своего сценария.

Как я могу выполнить msbuild из Delphi, предварительно подготовив его к переменным среды, найденным в rsvars.bat?

+1

Если бы это было мне, я бы порт rsvars в Delphi и создавать процесс MSBuild непосредственно –

ответ

8

Как показано на рисунке this answer, вы можете запустить cmd.exe с параметрами командной строки для выполнения команд.

согласно cmd.exe documentation:

Синтаксис

cmd [/c|/k] [/s] [/q] [/d] [/a|/u] [/t:{<B><F>|<F>}] [/e:{on|off}] [/f:{on|off}] [/v:{on|off}] [<String>] 

Параметры


Проводит команду, указанную Строка, а затем останавливается.
...
<String>
Указывает команду, которую вы хотите выполнить.
...

Замечания

  • Использование нескольких команд

    Чтобы использовать несколько команд для < строки >, разделите их с помощью команды сепаратора & & и заключить их в кавычки. Например:

    "<Command>&&<Command>&&<Command>" 
    
  • Обработка кавычки

    Если указать или ЦМД обрабатывает остаток строки и кавычки сохраняются только если выполнены все следующие условия:

    • Вы не используете .

    • Вы используете ровно один набор кавычек.

    • Вы не используете специальные символы в кавычках (например: & < > () @^|).

    • В кавычках используется один или несколько символов пробела.

    • Строка в кавычках - это имя исполняемого файла.

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

Так попробуйте использовать CreateProcess() или ShellExecute/Ex() запустить экземпляр cmd.exe с этими параметрами:

cmd.exe /C ""<path>\rsvars.bat" && msbuild "<path>\project" <msbuild parameters> ..." 

В качестве альтернативы, вы можете иметь ваше приложение нагрузки rsvars.bat и разобрать значения его определяет (или просто определяет значения в вашем собственном коде), а затем выполняет msbuild с использованием CreateProcess(), передавая требуемые переменные среды к его параметру lpEnvironment. Таким образом, вам не нужно фактически выполнять rsvars.bat.

+0

ли кавычки, как предполагается, быть обернутым вокруг всех параметров? Я думаю, это то, что меня отталкивает, потому что некоторые из параметров сами имеют свои собственные цитаты вокруг значений полного пути/имени файла. –

+0

@JerryDodge: в документации, которую я разместил, для '' && 'нужно использовать все' '', а отдельные команды также могут иметь свои собственные кавычки. Я обновил свой ответ с большей ссылкой на документацию. –

+0

Спасибо, что сделал трюк. Однако теперь я стараюсь полностью игнорировать файл 'rsvars.bat' и вызывать' msbuild' напрямую. –

3

Другим способом, который работает, является объединение обеих команд в новый пакетный файл. Это также позволяет создавать несколько проектов с использованием одной и той же среды. Например DoBuild.bat со следующим содержимым:

call "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\rsvars.bat" 
msbuild "<path>\MyProject.dproj" 
msbuild "<path>\MyOtherProject.dproj" 
msbuild "<path>\YetAnotherProject.dproj" 

Затем просто выполнить пакетный файл:

Cmd.exe /K "<path>\DoBuild.bat" 
+2

Если вы используете '/ C',' cmd.exe' завершается после завершения команды. Если вместо этого вы используете '/ K', он продолжает работать. –

+0

@Remy Duly отметил и обновлен. Спасибо. –

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