Social Icons

суббота, 17 октября 2009 г.

О пользе 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 .ProjectPathMyProject.dproj /p:configuration=Release

Первая строчка вызывает файл rsvars.bat. Он находится в $(BDS)Bin и содержит переменные среды для MSBuild. Затем вызывается сам MSBuild, причем указывается конфигурация Release.

Таким образом мы получили простой и удобный инструмент, который позволяет легко, в один шаг скомпилировать проект любой сложности точно так же просто, как это делается в среде Delphi.

Замечание: в Delphi 2009 конфигурация передается параметром config вместо configuration. Таким образом комманда компиляции будет выглядеть:
call rsvars.bat  msbuild .ProjectPathMyProject.dproj /p:config=Release

http://mikesoft.ws/2007/09/01/delphi-msbuild/

2 комментария:

  1. Как из командной строки проставить версию продукта?

    ОтветитьУдалить
    Ответы
    1. http://stackoverflow.com/questions/10251061/how-to-specify-file-version-when-building-exe-using-msbuild
      http://stackoverflow.com/questions/284258/how-do-i-set-the-version-information-for-an-existing-exe-dll
      http://stackoverflow.com/questions/5388750/incrementing-delphi-xe-project-version-number-from-command-line
      или использовать FinalBuilder

      Удалить

Поделитесь с друзьями!

 

Подписчики

Статистика