Пользовательский компонент зависимости ад - PullRequest
10 голосов
/ 24 марта 2012

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 13 августа 2013

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

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

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

0 голосов
/ 09 ноября 2013

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

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

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

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

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

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

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

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

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

0 голосов
/ 28 апреля 2013

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

0 голосов
/ 25 марта 2012

Резюме

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

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

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

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

Время проектирования

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

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

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

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

Обычно я помещаю проекты 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...

Приветствие.

...