Ад зависимости пользовательских компонентов

Я пытаюсь создать пакет для созданного мною нестандартного компонента. Он основан на нескольких библиотеках, включая Graphics32, GraphicEx и CCR.Exif.

Я создал проект Package, написал модуль, включая его процедуру Register, добавил несколько дополнительных ссылок, которые Delphi уведомила меня о разделе requires (включая dbrtl.dcp, inet.dcp, soaprtl.dcp, vclimg.dcp, xmlrtl.dcp и dclGraphicEx140.dcp) и добавил много модулей в раздел contains, чтобы избежать неявных предупреждений об этом. Проект компилируется, и его можно без проблем установить и использовать на моем компьютере. Однако когда я хочу установить его на другую машину, начинаются проблемы. В конце концов, мне пришлось скопировать все DCU из всех сторонних компонентов, которые я использовал, а также DCP и BPL от GraphicEx, которые мне даже пришлось установить.

Поставка большого количества файлов - это облом, но это преодолимо, но устанавливать и другие пакеты тоже нельзя. Я мог бы избавиться от этих DCP и BPL, поместив еще больше единиц в раздел contains, но это привело к появлению сообщений об ошибках на моем компьютере, где фактически установлен GraphicEx. Меня это сбивает с толку, потому что с Graphics32 ничего подобного не происходит ...

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


person Thijs van Dien    schedule 24.03.2012    source источник
comment
Установка компонентов - это позор Delphi, который до сих пор постоянно игнорируется Embarcadero.   -  person kludg    schedule 24.03.2012
comment
Какой тип распространения вы делаете для пользователей скомпилированных приложений или других разработчиков, чтобы они могли использовать их в среде IDE?   -  person afrazier    schedule 24.03.2012
comment
@afrazier Пакеты с элементами управления, которые могут использовать другие разработчики (члены команды).   -  person Thijs van Dien    schedule 24.03.2012
comment
Я согласен с @Serg. Я всегда хочу повеситься, когда мне нужно развернуть зависимые компоненты. Я даже не стал создавать пакеты. Я загружаю большинство своих компонентов во время выполнения, чтобы избежать этого кошмара ...   -  person kobik    schedule 25.03.2012
comment
Так как же это делают сторонние разработчики компонентов? Они всегда используют только VCL ?! Я не могу себе представить, что лучшим решением было бы вручную скопировать все используемые единицы в свои, а затем удалить их из uses ...   -  person Thijs van Dien    schedule 25.03.2012
comment
Какая версия Delphi / V.C.L. ты используешь ?   -  person umlcat    schedule 25.03.2012
comment
@tvdien, большая часть сторонних VCL, которые я видел, зависят только от встроенного VCL / RTL, за исключением случаев, когда они используют хорошо известные другие сторонние компоненты в качестве опции, например как TNT (который обычно является параметром директивы компилятора) или необходимо добавить поддержку PNG (поэтому они используют PngImage как параметр), или на основе VST и т.д. и т.д., конечно, все зависит от версии Delphi, поскольку большинство известных 3-х партийные компоненты (не коммерческие) теперь интегрированы в более новые версии Delphi (например, XE / 2).   -  person kobik    schedule 25.03.2012


Ответы (4)


То, что вы испытали, - обычное дело для тех, кто пишет компоненты. Распределение всегда такое. Пакеты не содержат других пакетов, если они ссылаются на них. Это в их природе.

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

В моем случае InnoSetup работает очень хорошо (http://www.jrsoftware.org/isinfo.php ).

person AlexSC    schedule 13.08.2013
comment
Как вы проверяете, что пакет еще не установлен (раз уж вы не можете установить его дважды)? Нет определенного места, где его можно было бы ожидать. - person Thijs van Dien; 09.11.2013
comment
@ThijsvanDien: все пакеты, зарегистрированные в IDE, перечислены в реестре Windows под HKEY_CURRENT_USER\Software\Embarcadero\BDS\7.0\Known Packages. Версия BDS зависит от версии Delphi. Если я не ошибаюсь, 7.0 означает Delphi 2010. Взгляните на элементы под этим ключом, чтобы определить, присутствует ли уже определенный пакет в IDE. - person AlexSC; 10.11.2013

Резюме

Некоторое время не использовал Delphi, но разработал свои пользовательские визуальные элементы управления (последней версией, над которой я работал, была Delphi 6).

При работе с зависимостями пакетов возникают 2 проблемы. Один из них устанавливается в среде Delphi, заставляя элементы управления появляться на палитре компонентов, а также редакторы компонентов и редакторы свойств.

И еще один при распространении скомпилированных пакетов на клиентские машины.

Это также зависит от того, какую версию Delphi вы используете.

Время разработки

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

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

Существует путь текстового поля для файлов «.dcp», другой путь для « .dcu» и т. Д.

Если у вас есть визуальные элементы управления и тому подобное, например, редакторы свойств или редакторы компонентов, лучше разделить код на 2 пакета («Runtime» и «Designtime»).

Я обычно помещаю проекты delphi (пакеты) за пределы установочной папки delphi.

Время выполнения

Обычно самый быстрый способ - поместить файлы «* .bpl», «.dcp» в папку Windows (32) / system или аналогичную папку Windows «DLL».


Предлагаемый исходный код структуры папок пакетов

Управление пакетами может быть трудным. Я не знаю, насколько изменился процесс установки с Embarcadero и более новыми версиями Delphi. Следующая диаграмма представляет собой пример того, как организовать исходный код. Надеюсь, поможет.

[-]--+--c:
.....|
.....+--[-]--+--software
.............|
.............+--[+]-----java
.............|
.............+--[+]-----php
.............|
.............+--[-]--+--delphi (not the delphi folder in program files)
.....................|
.....................+--[+]-----apps (source code for delphi programs)
.....................|
.....................+--[+]-----other
.....................|
.....................+--[-]--+--packages (all delphi packages source code here)
.............................|
.............................+--[+]-----lib (a single package for non visual controls, libraries)
.............................|
.............................+--[+]-----tools (package pair for non visual tcomponent descendants)
.............................|
.............................+--[+]-----json (example)
.............................|
.............................+--[+]-----xml (example)
.............................|
.............................+--[-]--+--mycontrols (folder custom visual controls)
.............................|.......|
.............................|.......+--[-]--+--delphi40 (folder for delphi40 version of "mycontrols")
.............................|.......|.......|
.............................|.......|.......+----------dsgvclctrls40.dpk (design-time package "mycontrols")
.............................|.......|.......|
.............................|.......|.......+----------runvclctrls40.dpk (run-time package "mycontrols")
.............................|.......|.......|
.............................|.......|.......+--[+]--+--demos (individual example for each "mycontrol")
.............................|.......|.......|
.............................|.......|.......+--[+]--+--design ("*.pas" component editors  destination folder)
.............................|.......|.......|
.............................|.......|.......+--[+]--+--sources ("*.pas" source code destination folder)
.............................|.......|.......|
.............................|.......|.......+--[+]--+--bin ("*.dcu" destination folder)
.............................|.......|........
.............................|.......+--[+]--+--delphi50 (folder for delphi50 version of "mycontrols")
.............................|.......|........
.............................|.......+--[+]--+--delphi60 (folder for delphi60 version of "mycontrols")
.............................|.......|........
.............................|.......+--[+]--+--delphi70 (folder for delphi70 version of "mycontrols")
.............................|................
.............................+--[-]-----etc...

Ваше здоровье.

person umlcat    schedule 24.03.2012
comment
Извините, но я не понимаю, как это отвечает на мой вопрос о том, как писать и / или распространять компонент таким образом, чтобы пользователю (разработчику) не приходилось принимать специальные меры (загрузка / установка зависимостей, организация своего проекта в конкретным способом) использовать его. - person Thijs van Dien; 25.03.2012
comment
Время разработки - это своего рода предыдущий шаг к вашей цели. Среда выполнения больше ориентирована на распространение. - person umlcat; 25.03.2012

Thijs, вы просто не можете этого сделать с одним пакетом. Целевому разработчику потребуется почти все, что вы добавили в пакет. Но есть альтернативный способ сделать то, что вы хотите: создать DLL со всеми компонентами / библиотеками, которые вы используете в своем собственном компоненте, и обернуть все эти внешние компоненты / библиотеки в некоторый код, который вы будете экспортировать из DLL. Затем создайте свой компонент, не используя напрямую внешние компоненты, а только созданную вами DLL. Вы не можете в своем компоненте "использовать" какие-либо единицы других внешних компонентов / библиотек. Вам нужно создать новый модуль со всеми типами данных и обязательной декларацией для всего, что вы экспортируете из своей DLL. Все это отлично работает, но быстро становится очень сложным для большого количества внешних компонентов или библиотек.

person fpiette    schedule 28.04.2013
comment
Могу ли я использовать BPL вместо DLL, чтобы иметь возможность использовать объекты? И разве нельзя скомпилировать BPL в exe? - person Thijs van Dien; 29.04.2013

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

Некоторое время назад я столкнулся с проблемами зависимости Delphi, пытаясь создать внутренний компонент для наших разработчиков. Мое предложение:

  1. Удалите все зависимости, которые использует ваш компонент.

  2. В вашем пакете компонентов удалите указанный выше dcp из раздела required вашего пакета.

  3. Скопируйте исходные файлы ваших зависимостей в свои компоненты

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

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

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

Опять же, AlexSC дает лучший ответ, а InnoStudio - отличный маленький инструмент.

person splrk    schedule 09.11.2013