Компания, в которой я работаю, разрабатывает систему на Delphi, которая содержит десятки модулей exe, и каждый из них в определенной степени идентичен исходному коду. К сожалению, никто никогда не заботился об использовании библиотек для размещения совместно используемого кода. Это означает, что каждый раз, когда в коде всех этих модулей необходимо исправить ошибку, программист должен вносить исправления во все из них по отдельности! Это всегда занимает так много времени ...
Я решил найти способ поместить общий код в библиотеки. Я рассматривал библиотеки DLL и BPL. В этом случае BPL казались гораздо более удобными для программистов и гораздо менее проблемными, особенно потому, что код используется только в нашем программном обеспечении и только в Delphi.
Я поместил весь код, используемый всеми модулями exe, в BPL, и все кажется прекрасным , но есть некоторые вещи, которых я не понимаю, и был бы признателен, если бы вы мне их объяснили.
После разделения кода на BPL я ожидал, что этого будет достаточно для развертывания exe-файлов с созданными мной BPL. Но оказалось, что им нужны еще и rtl100.bpl, и vcl100.bpl. Почему это так? Я хочу использовать только бывших и моих BPL. Я не хочу предоставлять конечным пользователям целую кучу библиотек, поставляемых Borland и сторонними компаниями :). Я хочу, чтобы они компилировались внутри exes, как раньше компилировались. Возможно ли это сделать?
На данный момент я сделал следующее:
И если дело доходит до проектов exe:
Это все, что я сделал. Проекты exe компилируются правильно, но у меня нет доступа к исходному коду BPL (я не могу перейти к этому коду из моих проектов exe), хотя все BPL хранятся вместе с файлами исходного кода. Зачем? Мне это кажется странным.
Я всегда стараюсь писать длинные описания - извините за это :). Буду признателен за вашу помощь. Мне просто нужно несколько слов пояснить упомянутые мной моменты:развертывание exe только с моими BPL, правильность того, что я делал в целом, и невозможность навигации по исходным кодам BPL. Заранее большое спасибо!
Всем спасибо за обсуждение. Некоторые говорили, что выбранный мной подход - не лучшая идея. Наше программное обеспечение состоит из более чем 100 модулей (большинство из них являются чем-то вроде драйверов для разных устройств). Большинство из них используют один и тот же код - в большинстве случаев классы. Проблема в том, что эти классы не всегда помещаются в отдельные автономные блоки pas. Я имею в виду, что общий код часто помещается в блоки, содержащие код, специфичный для модуля. Это означает, что когда вы исправляете ошибку в общем классе, недостаточно скопировать модуль pas, в котором он определен, во все программные модули и перекомпилировать их. К сожалению, вам придется копировать и вставлять фиксированные фрагменты кода в каждый модуль, один за другим, в соответствующий модуль и класс. На это уходит много времени, и это то, от чего я хотел бы избавиться, выбрав правильный подход - пожалуйста, помогите мне.
Я думал, что использование BPL было бы хорошим решением, но, как некоторые из вас упомянули, у него есть некоторые недостатки. Наихудшая проблема заключается в том, что если каждому EXE требуется несколько BPL, сотрудники нашей службы технической поддержки должны будут знать, какие EXE нужны какие BPL, а затем предоставить конечным пользователям соответствующие файлы. Пока у нас нет средства обновления программного обеспечения, это будет очень полезно как для наших технических специалистов, так и для конечного пользователя. Они наверняка заблудятся и рассердятся: - /.
Также могут возникнуть проблемы с совместимостью - если один BPL используется многими EXE, изменение одного BPL может быть хорошо для одного EXE и плохо для некоторых других - @Warren P .
Что мне тогда делать, чтобы быстрее исправлять ошибки в таком большом количестве проектов? Я думаю об одном из следующих подходов. Если у вас есть лучшие идеи, дайте мне знать.
Это решение кажется нормальным, поскольку согласован повторно модифицированный код. Но у нас также есть блоки pas с функциями и процедурами общего назначения, которые часто отменяют изменения - мы добавляем туда новые функции, когда это необходимо, но в отдельных проектах. Итак, представьте, что вы пишете новую функцию в одном из 100 модулей и помещаете ее в единицу общего пользования. Через месяц или два вы модифицируете другой модуль и думаете, что вам нужна та же функция, которую вы написали 2 месяца назад. Вам нужно найти модуль (это сложно, если вы не помните, какой это был) и скопировать функцию в свой код. И, очевидно, единицы общего использования становятся совершенно разными в каждом модуле, если они хранятся в каждом проекте отдельно. А затем, если нужно исправить ошибку ... вся история повторяется.
Для меня это кажется лучшее решение сейчас, но есть несколько минусов. Если я исправлю ошибку в BPL, каждый программист должен будет обновить BPL на своем компьютере. Что, если они забудут? Но все же я считаю, что это небольшая проблема. Если мы позаботимся о том, чтобы информировать друг друга об изменениях, все должно быть в порядке.
Пожалуйста, помогите мне выбрать хорошее решение. Я просто не хочу, чтобы компания тратила на исправление ошибок гораздо больше времени и денег, чем необходимо, только из-за глупого подхода к разработке программного обеспечения.
Большое спасибо.