Пакет (BPL) Автоматическое сухое имя

Я пишу много компонентов и библиотек для Delphi, большинство из которых требуют использования BPL Packaging, чтобы они могли быть установлены в среду IDE.

Это достаточно просто и работает хорошо, вплоть до тех пор, пока вы не захотите поддерживать один набор файлов проектов пакетов (в одной группе проектов), но также хотите скомпилировать и распространять те же пакеты для разных версий Delphi.

До сих пор я создавал другой проект пакета для каждой версии Delphi и явно определял идентификатор версии Delphi как суффикс (например, Kinect_XE.bpl и Kinect_XE2.bpl).

Мне известно, что в разделе "Параметры проекта для проекта пакета" в разделе "Описание" есть поля префикс LIB и (что более важно для моих нужд) Суффикс LIB.

Мне известно, что если я поместил значение в LIB суффикс, он будет добавлен в конец скомпилированного имени файла BPL.

Однако первый вопрос заключается в том, возможно ли, чтобы IDE автоматически заполнила поле LIB суффикс с номером версии IDE/RTL, и если так... как?

Я уверен, что это возможно, поскольку, как представляется, vcl120.bpl (и его сопоставления для каждой соответствующей версии Delphi) можно ссылаться (как требования) на ваши собственные пакеты, используя просто vcl вместо того, чтобы набирать полный vcl120. Это, по сути, такое же поведение, на которое я надеюсь достичь... где мои пакеты могут интрареплицировать друг друга (как необходимо) без необходимости предоставлять ссылки на конкретные версии для размещения суффиксов.

Не менее важно, чтобы это разрешило мне поддерживать один набор файлов проекта в одной группе проектов (с очевидным исключением XE2, где его файлы проекта не обязательно хорошо себя ведут с предыдущими версиями Delphi из-за добавление платформ).

Я подозреваю, что мне может потребоваться значение $(VER) (или что-то подобное) в поле LIB суффикс, но это, похоже, не работает, и Я искал Google для поиска правильного решения.

Надеюсь, вы сможете помочь!

ОБНОВЛЕНИЕ 1

Теперь я пишу плагин IDE для использования с (по крайней мере) Delphi 2007 для XE2, который дает DLL и BPL проекты новый параметр AutoSuffix. При включенном подключении любая IDE с установленным плагином AutoSuffix немедленно применит к проекту подходящий суффикс версии IDE.

Плагин AutoSuffix будет доступен (свободно) для всех в течение следующих 24 часов, и этот вопрос будет соответствующим образом обновлен.

ОБНОВЛЕНИЕ 2

Хорошо... Delphi 2007 - это боль! Я сделал AutoSuffix с 2009 года до XE2, но в 2007 году требуется немного больше времени (терпение оценивается).

ОБНОВЛЕНИЕ 3

Казалось бы, что Embarcadero услышал наш коллективный крик для более простой унификации пакетов между версиями.

Марк собирается пропустить это, чтобы увидеть, могут ли будущие версии Delphi использовать функцию {$ LIBSUFFIX AUTO}. Я надеюсь услышать очень скоро, будет ли это так. Если это так, это, безусловно, влияет на то, как AutoSuffix должен будет работать с XE2 и более старыми версиями (поскольку в настоящее время он не предоставляет простой переключатель AUTO.. ​​у него есть свой собственный метод).

Моя надежда теперь в том, что EMB серьезно воспримет этот запрос, предоставит его как неотъемлемую функцию в будущем, так что это станет простым примером использования AutoSuffix в существующих версиях для унификации процесса по всем версиям!

Ответ 1

AFAIK для Delphi до XE2 для этого не существует автоматизма.

В отношении предложения require: когда вы require другого пакета, вы фактически используете dcp, который не наследует LIBSUFFIX. Таким образом, во время компиляции достаточно потребовать VCL.dcp, а VCL160.bpl фактически используется во время выполнения. DCP включает полное имя BPL, чтобы решить эту проблему.

Это делает подход LIBSUFFIX выше простого "переименовать пакет для каждой версии Delphi".

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

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

Ответ 2

Директива

LIBSUFFIX находится в файле *.dpk, и вы можете редактировать файл *.dpk вручную.

Вы можете написать, например

{$IFDEF CONDITIONALEXPRESSIONS}
   {$IF CompilerVersion = 20.0}
{$LIBSUFFIX '120'}
   {$IFEND}
   {$IF CompilerVersion = 21.0}
{$LIBSUFFIX '140'}
   {$IFEND}
{$ENDIF}

Плохо то, что IDE не уважает ваши ручные изменения файла *.dpk и удаляет их, а затем вносит изменения в пакет. Вот почему некоторые поставщики компонентов, которые используют условные определения в файле *.dpk, говорят в инструкции по установке, если его попросят сохранить изменения, скажите "НЕТ".

Ответ 3

Мое предложение состояло в том, чтобы добавить это как настраиваемую опцию для создания вариантов опций проекта (см. QС# 86491.) Вместо того, чтобы обновлять все пакеты достаточно было бы обновить один файл набора параметров.

На самом деле, кажется, что тег DllSuffix распознается файлами параметров в Delphi XE/XE2. Добавление <DllSuffix>160</DllSuffix> в раздел <PropertyGroup> файла набора параметров приведет к добавлению суффикса в пакет в диспетчере проектов. Однако вам все равно нужно открыть параметры проекта и нажать "ОК", чтобы сохранить его в файле .dpk.

Я согласен с тем, что это было бы очень полезно с этой функцией (я бы тоже подумал о пакетах в RTL.)