Как правильно разделить проект Delphi на BPL?

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

Я решил найти способ поместить общий код в библиотеки. Я рассматривал библиотеки DLL и BPL. В этом случае BPL казались гораздо более удобными для программистов и гораздо менее проблемными, особенно потому, что код используется только в нашем программном обеспечении и только в Delphi.

Я поместил весь код, используемый всеми модулями exe, в BPL, и все кажется прекрасным , но есть некоторые вещи, которых я не понимаю, и был бы признателен, если бы вы мне их объяснили.

  1. После разделения кода на BPL я ожидал, что этого будет достаточно для развертывания exe-файлов с созданными мной BPL. Но оказалось, что им нужны еще и rtl100.bpl, и vcl100.bpl. Почему это так? Я хочу использовать только бывших и моих BPL. Я не хочу предоставлять конечным пользователям целую кучу библиотек, поставляемых Borland и сторонними компаниями :). Я хочу, чтобы они компилировались внутри exes, как раньше компилировались. Возможно ли это сделать?

  2. На данный момент я сделал следующее:

    • Я поместил все общие блоки pas в BPL. Каждый BPL содержит модули, принадлежащие к одной и той же категории, поэтому программистам ясно, какой код ожидать в данном BPL.
    • Каждый BPL является библиотекой «времени выполнения и времени разработки».
    • Каждый BPL «явно перестраивается». Два последних являются настройками проекта по умолчанию для BPL.
  3. И если дело доходит до проектов exe:

    • Я удалил все блоки, которые я ранее поместил в BPL.
    • Я установил свои BPL из Инструменты-> Установить пакетное меню в BDS 2006.
    • В моих настройках проекта exe я проверил опцию «сборка с пакетами времени выполнения» и перечислил все мои пакеты BPL в поле редактирования ниже (только мои пакеты, так как я удалил все остальные, которые там появлялись

Это все, что я сделал. Проекты exe компилируются правильно, но у меня нет доступа к исходному коду BPL (я не могу перейти к этому коду из моих проектов exe), хотя все BPL хранятся вместе с файлами исходного кода. Зачем? Мне это кажется странным.

Я всегда стараюсь писать длинные описания - извините за это :). Буду признателен за вашу помощь. Мне просто нужно несколько слов пояснить упомянутые мной моменты:развертывание exe только с моими BPL, правильность того, что я делал в целом, и невозможность навигации по исходным кодам BPL. Заранее большое спасибо!


Всем спасибо за обсуждение. Некоторые говорили, что выбранный мной подход - не лучшая идея. Наше программное обеспечение состоит из более чем 100 модулей (большинство из них являются чем-то вроде драйверов для разных устройств). Большинство из них используют один и тот же код - в большинстве случаев классы. Проблема в том, что эти классы не всегда помещаются в отдельные автономные блоки pas. Я имею в виду, что общий код часто помещается в блоки, содержащие код, специфичный для модуля. Это означает, что когда вы исправляете ошибку в общем классе, недостаточно скопировать модуль pas, в котором он определен, во все программные модули и перекомпилировать их. К сожалению, вам придется копировать и вставлять фиксированные фрагменты кода в каждый модуль, один за другим, в соответствующий модуль и класс. На это уходит много времени, и это то, от чего я хотел бы избавиться, выбрав правильный подход - пожалуйста, помогите мне.

Я думал, что использование BPL было бы хорошим решением, но, как некоторые из вас упомянули, у него есть некоторые недостатки. Наихудшая проблема заключается в том, что если каждому EXE требуется несколько BPL, сотрудники нашей службы технической поддержки должны будут знать, какие EXE нужны какие BPL, а затем предоставить конечным пользователям соответствующие файлы. Пока у нас нет средства обновления программного обеспечения, это будет очень полезно как для наших технических специалистов, так и для конечного пользователя. Они наверняка заблудятся и рассердятся: - /.

Также могут возникнуть проблемы с совместимостью - если один BPL используется многими EXE, изменение одного BPL может быть хорошо для одного EXE и плохо для некоторых других - @Warren P .

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

  • Поместите общий код в отдельные и автономные блоки pas, поэтому, когда в одном из них есть исправление ошибки, достаточно скопировать его во все проекты (перезаписать старые файлы ) и перекомпилируйте их все.

Это решение кажется нормальным, поскольку согласован повторно модифицированный код. Но у нас также есть блоки pas с функциями и процедурами общего назначения, которые часто отменяют изменения - мы добавляем туда новые функции, когда это необходимо, но в отдельных проектах. Итак, представьте, что вы пишете новую функцию в одном из 100 модулей и помещаете ее в единицу общего пользования. Через месяц или два вы модифицируете другой модуль и думаете, что вам нужна та же функция, которую вы написали 2 месяца назад. Вам нужно найти модуль (это сложно, если вы не помните, какой это был) и скопировать функцию в свой код. И, очевидно, единицы общего использования становятся совершенно разными в каждом модуле, если они хранятся в каждом проекте отдельно. А затем, если нужно исправить ошибку ... вся история повторяется.

  • Создавайте BPL для всего общего кода, но связывайте их с EXE-файлами, чтобы EXE-файлы были автономными.

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

  • @CodeInChaos: Не знаю, правильно ли я вас понял. Вы имеете в виду совместное использование файлов pas между проектами? Как это сделать? Исходные коды храним в SVN. Это означает, что нам придется хранить общий код в отдельной папке и заставлять все проекты искать этот код там, верно? И загрузите из SVN проект и все папки, от которых он зависит ...

Пожалуйста, помогите мне выбрать хорошее решение. Я просто не хочу, чтобы компания тратила на исправление ошибок гораздо больше времени и денег, чем необходимо, только из-за глупого подхода к разработке программного обеспечения.

Большое спасибо.

11
задан Lasse V. Karlsen 23 August 2011 в 08:22
поделиться