Компания, с которой я работаю, разрабатывает систему в Delphi, которая содержит десятки модулей exe, и каждый из них в определенной степени идентичен, если речь идет о исходном коде. К сожалению, никто никогда не заботился о том, чтобы использовать библиотеки для размещения общего кода. Это означает, что каждый раз, когда в коде присутствуют исправления ошибок, все эти модули распространяются, программист должен внести исправления во всех них отдельно! Это всегда занимает много времени...
Я решил найти способ поместить общий код в библиотеки. Я рассматривал DLL и BPL. В этом случае BPL выглядели гораздо более удобными для программистов и гораздо менее хлопотными, особенно, что код используется только в нашем программном обеспечении и только в Delphi.
Я поместил весь код, разделяемый всеми модулями exe, в BPL, и все кажется прекрасным, но есть некоторые вещи, которые я не понимаю, и был бы благодарен, если бы вы объяснили мне это.
-
То, что я ожидал после деления кода на BPL, было то, что было бы достаточно развернуть exe файлы с созданными мной BPL. Но оказалось, что им нужны и rtl100.bpl и vcl100.bpl. Почему это так? Я хочу развернуть exes и мои BPL. Я не хочу предоставлять конечным пользователям целую кучу библиотек, поставляемых Borland и сторонними компаниями:). Я хочу, чтобы они были скомпилированы в exes, как они раньше компилировались. Возможно ли это сделать?
-
Что я сделал до сих пор:
- Я поместил все разделяемые единицы pas в BPL. Каждая BPL содержит единицы, относящиеся к одной и той же категории, поэтому для программистов ясно, какой код следует ожидать в данной BPL.
- Каждая BPL представляет собой библиотеку времени исполнения и времени разработки.
- Каждая BPL "перестроена явно". Два последних являются настройками проекта по умолчанию для BPL.
-
И если речь идет о проектах exe:
- Я удалил все единицы, которые я ранее ввел в BPL.
- Я установил свои BPL из меню Tools- > Install package в BDS 2006.
- В моих настройках проекта exe я проверил вариант "сборка с пакетами времени выполнения", и я перечислил все мои пакеты BPL в окне редактирования ниже (только мои пакеты, поскольку я очистил все остальные, которые появились там).
Это все, что я сделал. Проекты exe компилируются должным образом, но у меня нет доступа к исходному коду BPL (я не могу перейти в этот код из моих проектов exe), хотя все BPL хранятся вместе с файлами исходного кода. Зачем? Мне это кажется странным.
Я всегда стараюсь писать длинные описания - извините за это:). Буду признателен за вашу помощь. Мне просто нужно несколько пояснений к пунктам, которые я упомянул: развертывание exe только с моими BPL, правильность того, что я делал в целом, и невозможность перейти в исходные коды BPL. Большое вам спасибо заранее!
Спасибо всем за обсуждение. Некоторые говорили, что подход, который я выбрал, не очень хорошая идея. Наше программное обеспечение состоит из более чем 100 модулей (большинство из них являются чем-то вроде драйверов для разных устройств). Большинство из них имеют один и тот же код - в большинстве случаев - классы. Проблема в том, что эти классы не всегда помещаются в отдельные автономные единицы. Я имею в виду, что общий код часто помещается в единицы, содержащие код, специфичный для модуля. Это означает, что когда вы исправляете ошибку в общем классе, недостаточно скопировать модуль 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 проекта и всех папок зависит от...
Пожалуйста, помогите мне выбрать хорошее решение. Я просто не хочу, чтобы компания теряла гораздо больше времени и денег, чем необходимо, при исправлениях только из-за глупого подхода к разработке программного обеспечения.
Большое спасибо.