О пользе MSBuild в Delphi
Рано или поздно в любых, более или менее серьезных проектах встает необходимость в автоматической компиляции или компиляции в один шаг. Зачем? Самая элементарная причина: чтобы быстро скомпилировать проект, не открывая его в среде. Например, был разработан крупный проект, включающий не один десяток компонентов, модулей, библиотек. Среда во время разработки сильно обросла посторонними и собственными компонентами и становится трудно различить, какой компонент используется в данном проекте, а какой — нет. Переносимости у проекта в данном случае никакой. На другом компьютере с установленной средой Delphi его не получится скомпилировать: придется переносить и устанавливать все необходимые компоненты, причем вспоминать, какой из них нужен, а какой нет. Это крайне неудобно, а если еще принять во внимание, что данный процесс подвержен ошибкам, то становится совсем невесело.
Издревле эту проблему решали с помощью make-файлов, которые были придуманы в Bell Labs, вероятно для сборки первых юниксов. Вместе с Delphi поставлялась и поставляется консольная утилита make.exe, которая и занимается сборкой проекта используя makefile. Но данный подход имеет существенный недостаток: makefile нужно писать вручную, в Delphi нет инструментов для его написания. А это значит, что придется задавать вручную пути ко всем компонентам, описывать параметры компиляции, директории для вывода промежуточных (DCU, OBJ) и конечных файлов (EXE, DLL) файлов.
К сожалению, такой подход долгое время был единственным возможным способом автоматической компиляции проектов. Несмотря на то, что все параметры, использующиеся средой Delphi для компиляции, всегда сохранялись вместе с проектом. До Delphi 7 включительно это были *.cfg и *.dof-файлы. В первом сохранялись параметры компиляции, а во втором все опции диалога Project Options. Потом появились файлы *.bdsproj, где хранилась вся информация о проекте. Но это не дало никаких преимуществ: компилятор DCC32 не понимает этих файлов и соответственно автоматическая компиляция невозможна.
Серьезный сдвиг произошел в Delphi 2007, где используется MSBuild Engine для компиляции проектов. Как оказалось, это дает именно то что нужно.
В Delphi 2007 на смену файлам *.bdsproj пришли файлы *.dproj (Delphi-проекты, для C++ Builder 2007 они имеют расширение *.cbproj). Эти файлы не просто содержат параметры проекта, они заодно и являются файлами инструкций сборки для MSBuild. «Скормив» такой файл MSBuild мы сможем скомпилировать проект так же, как если бы мы компилировали его в среде Delphi: с учетом всех путей, конфигураций, опций компилятора и используемых директорий.
С помощью MSBuild процесс автоматической сборки проекта становится до элементарного простым. Составляем файл Build.cmd примерно такого содержимого:
call rsvars.bat msbuild MyProject.dproj /p:configuration=Release
Первая строчка вызывает файл rsvars.bat. Он находится в $(BDS)Bin и содержит переменные среды для MSBuild. Затем вызывается сам MSBuild, причем указывается конфигурация Release.
Таким образом мы получили простой и удобный инструмент, который позволяет легко, в один шаг скомпилировать проект любой сложности точно так же просто, как это делается в среде Delphi.
Замечание: в Delphi 2009 конфигурация передается параметром config вместо configuration. Таким образом комманда компиляции будет выглядеть:
call rsvars.bat msbuild MyProject.dproj /p:config=Release
Также желательно добавлять команду /t:rebuild — чтобы полностью пересобрать проект и включить в него все обновленные ресурсы и файлы (при обычной компиляции эти они могут не обновиться).