Структура каталогов проекта со сторонними компонентами

#delphi #components #build-automation #project-structuring

#delphi #Компоненты #автоматизация сборки #структурирование проекта

Вопрос:

Я должен поддерживать старое программное обеспечение, написанное на Delphi. Дерево исходных текстов представляет собой настоящий беспорядок. Я пытаюсь сделать 2 вещи: создать чистую структуру каталогов и настроить автоматизированный процесс сборки.

Прямо сейчас я создал следующее дерево каталогов

 Проект
  сборка вывод 
distrelease 
distdebug 
doc 
env 
 res
 src

src каталог содержит *.pas и *.dfm файлы и project.dpr . В res каталоге находятся различные ресурсы (иконки, изображения и шрифты). env используется для создания различных сред в целях отладки. IDE была настроена для сборки project.exe в этот каталог. Скрипты сборки хранятся в build папке. Эти скрипты производят распространение продукта (с отладочной информацией в exe и без нее) в distrelease и distdebug папках с помощью dcc32.exe . buildoutput используется для сохранения файлов dcu во время процесса сборки внутри IDE или внутри сценария сборки.

В моем подходе есть небольшой недостаток. Я не могу начать с нового компьютера, извлечь код из моего репозитория, запустить скрипт сборки и получить готовое к использованию описание проекта. Сначала мне нужно открыть IDE, установить необходимые компоненты (например, RXLib и MemoEx ), настроить пути к библиотекам и так далее. Только после этих шагов я могу запускать свои скрипты сборки.

До прошлой недели это не было большой проблемой. Я модифицировал сторонний компонент, чтобы исправить ошибку (этот компонент больше не поддерживается :- (), поэтому я должен добавить код этого компонента в структуру моего проекта. На этом этапе, если я выполню проверку из репозитория, мне нужно проверить, были ли изменения в коде сторонних библиотек. Если код библиотек был изменен, мне нужно перекомпилировать компоненты и переустановить их.

Вопросы

  1. Есть ли какой-либо способ переустановить компоненты в Delphi 7 из командной строки? Есть ли какой-либо способ сделать это без жесткого указания пути установки D7?
  2. Как бы вы хранили код сторонних компонентов в дереве проекта?
  3. Где я должен разместить bpl и dcu что будет создано во время сборки компонентов. Должен ли я размещать их в Projectbuildoutput ? Или будет лучше разместить выходные данные в другом месте (не переопределять настройки Delphi), но изменить путь к библиотеке в конфигурации проекта?

Ответ №1:

  1. Вам просто нужно скомпилировать пакет с помощью компилятора командной строки delphi. Если путь к ячейке Delphi указан в вашем PATH , вам не нужно жестко кодировать путь установки. Если ваша система сборки способна считывать данные из реестра, вы получаете путь, например HKEY_LOCAL_MACHINESOFTWARECodeGearBDS6.0RootDir (в данном случае Delphi 2009).

  2. Я бы добавил еще одну ветку components с подразделениями для каждого пакета. Не смешивайте их со своими проектами.

  3. По моему опыту, лучше всего хранить их в месте назначения delphi (где зависит от версии delphi).

Комментарии:

1. Если вы рекомендуете добавлять components в качестве подмодулей (вложенных репозиториев в терминах mercurial), то было бы лучше хранить dcu и bpl где-нибудь внутри их репозиториев. Не так ли? В другом случае когда-нибудь это приведет к сбою процесса сборки для другого приложения, которое использует тот же компонент, но другой версии.

2. Я имею в виду, что, если каждый из них component будет находиться в componentsrc , а инструмент сборки будет компилироваться dcu и bpl в componentbuild . Эти файлы dcu и btl будут использоваться для установки компонента в IDE (время разработки). Тем временем мой файл project.dof будет отредактирован, чтобы использовать путь к библиотеке ..componentscomponentsrc . Во время сборки проекта инструмент выполнит поиск в этом каталоге и соберет компоненты компонента в dcu и сохранит их в projectbuildoutput .

3. @Konstantin Mikhaylov, ваше мнение об «установке компонента» может быть немного неточным. Компоненты устанавливаются как пакеты (DCP), и существует только ОДИН список установленных пакетов, список не «для каждого проекта». Компоненты не устанавливаются в IDE при открытии проекта, и они не изменяются, когда вы закрываете проект и открываете другой. Фактически, среда разработки Delphi IDE позволяет открывать несколько проектов одновременно! Вот почему в моем ответе я говорю «ни один проект не владеет сторонними компонентами», поэтому я не рекомендую помещать их под контроль версий в один каталог с самим проектом […]

4. @Konstantin Mikhaylov, […] Если сторонние компоненты не являются частью проекта, у вас не возникает проблемы сопоставления сторонних компонентов с onces, используемыми в проекте. На самом деле у вас есть, но это не может быть решено как часть проекта. Как только с этим будет покончено, возможно, вам захочется пересмотреть свой вариант хранения файлов DCU и BTL в Mercurial. Я также использую Mercurial, и это grate; Но ему не нравятся двоичные файлы, а DCU, BTL и EXE — это все двоичные файлы. Я не храню их в VCS. Как часть любого выпуска, я всегда делаю «build all», поэтому DCU не имеют значения.

Ответ №2:

Обновление: Заметил часть вопроса с запросом установки из командной строки.

На самом деле вы не можете установить из командной строки, но было бы легко создать что-то, что сделало бы это. Вы можете скомпилировать пакеты с помощью DCC32.EXE .

Установка компонентов контролируется записями реестра. Расположение в реестре отличается для каждой версии Delphi, но оно соответствует одному и тому же базовому шаблону. Примеры:

Delphi 2007 HKEY_CURRENT_USERSoftwareBorlandBDS5.0Known Packages Delphi XE ‘HKEY_CURRENT_USERSoftware Embarcadero BDS 8.0 Известные пакеты’

Мы обновляем это с помощью FinalBuilder, после того как мы соберем все сторонние компоненты. Это упрощает синхронизацию каждого разработчика.

Что касается структуры каталогов, я заранее думаю о контроле версий и делаю следующее.

Корневой каталог…

 C:devtrunk
  

Это позволяет мне создавать ветки в простом формате.

 C:devbranch1
  

Оттуда я делаю следующее:

Я использую общий каталог для Bin и DCU, поскольку я занимаюсь разработкой большого количества пакетов, многие из которых необходимо загрузить во время разработки. Это избавляет от необходимости добавлять много каталогов в системный путь, чтобы поддерживать работоспособность Delphi.

 outputDelphiXEBin
outputDelphiXEDcu
  

Это может быть улучшено, если необходимо, таким образом:

 outputDelphiXEReleaseBin
outputDelphiXEReleaseDcu
outputDelphiXEDebugBin
outputDelphiXEDebugDcu
  

Для каждого проекта я делаю это, хотя часто я размещаю более одного проекта в одном и том же
каталог, если они полагаются на большую часть одного и того же кода.

 project (DPR/DPK Here)
projectsource (if the project is small, if not I break it out further)
projectforms
projectclasses
projectdatamodules
projectresources
projectinstall (Install Scripts)
etc...
  

Наконец, для компонентов и кода, общего для разных проектов.

 Commonlib (Directory for my code that common among projects)
Components3rdPartyName
Components3rdPartyName2
Components3rdPartyName3
  

Я делаю это таким образом, чтобы я знал, что каждая вещь создала мою версию X моего приложения, просто используя номер редакции системы управления версиями.

В довершение всего я создаю переменную среды для

C:DEVTRUNK

Затем я использую переменную среды в пути к системной библиотеке. Вот так:

 %MYCODE%components3rdParty1;%MYCODE%components3rdParty2
  

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

Комментарии:

1. Приятная информация. Это тот инструмент, который я продолжаю создавать. Затем я иду проверить установщик JVCL, который начинался так, и я думаю, может быть, я просто изменю установщик JVCL.

Ответ №3:

1: Да и нет, вы можете разработать свои собственные компоненты для установки из командной строки (где «из командной строки» означает устанавливать их программно, если вам действительно нужна командная строка, возможно, вам потребуется написать инструмент). компоненты сторонних производителей обычно поставляются с программой установки, которая выполняет больше, чем установка и регистрация самих компонентов. Теоретически вы можете автоматизировать все, что делает установщик, и, по сути, переупаковать компонент для собственного использования, но при этом вы можете столкнуться с юридическими препятствиями.

2. сторонние компоненты не привязаны к проекту. Хранить эти файлы в каталоге проекта не очень хорошая идея. Что происходит, когда вы повторно используете те же компоненты в другом проекте? Вы копируете все исходные файлы в новый проект? Для моей собственной работы у меня установлены все сторонние компоненты в одну папку, отдельную от каталога любого проекта, и я держу эту папку под контролем версий.

3. Использование отдельного выходного каталога для каждого проекта — хорошая идея, это значительно упрощает использование условной компиляции. Я бы предложил отдельные выходные каталоги для отладки и выпуска. Что касается сторонних БПЛ, то они также не являются частью проекта, потому что ни один проект не «владеет ими».

Комментарии:

1. Я сомневаюсь, что существуют какие-либо юридические препятствия для автоматической установки компонентов. Мы используем FinalBuilder для перестройки всего, включая компоненты сторонних производителей. Затем мы написали скрипт для их установки в Delphi. Основная причина в том, что синхронизировать версии сторонних компонентов для 10 разных разработчиков теперь действительно легко… ОБНОВЛЕНИЕ SVN. Запустите скрипт FinalBuilder.