Событие предварительной сборки Delphi не выполняется ДО компиляции - PullRequest
12 голосов
/ 18 января 2010

Я занят автоматизацией наших сборок, чтобы включить номер ревизии SVN. Мы используем Delphi 2010. Я добавил событие предварительной сборки, вызывающее пакетный файл, который внедряет номер редакции svn (считанный из файла записей в каталоге .svn) и указанный номер версии в aVersionInfo.rc, который компилируется мой проект. Событие перед сборкой выглядит так:

call SetVersionInfo.bat 6 5 4

... и командный файл (надеюсь, кто-то найдет это полезным) ...

@ECHO OFF
SETLOCAL
setLocal EnableDelayedExpansion

SET _myVar=0
FOR /F %%G in (.svn\entries.) DO (
IF !_myVar! LSS 3 SET /A _myVar+=1 & SET _svn_dir_rev=%%G
)

ECHO 1 VERSIONINFO > aVersionInfo.rc
ECHO. FILEVERSION %1,%2,%3,%_svn_dir_rev%   >> aVersionInfo.rc
ECHO. PRODUCTVERSION 1   >> aVersionInfo.rc
ECHO. FILEOS VOS__WINDOWS32   >> aVersionInfo.rc
ECHO. FILETYPE VFT_APP   >> aVersionInfo.rc
ECHO. BEGIN   >> aVersionInfo.rc
ECHO.   BLOCK "StringFileInfo"   >> aVersionInfo.rc
ECHO.   BEGIN   >> aVersionInfo.rc
ECHO.     BLOCK "080904b0"   >> aVersionInfo.rc
ECHO.     BEGIN   >> aVersionInfo.rc
ECHO.       VALUE "CompanyName","COMPANY\000"   >> aVersionInfo.rc
ECHO.       VALUE "FileDescription","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "FileVersion","%1.%2.%3.%_svn_dir_rev%\000"   >> aVersionInfo.rc
ECHO.       VALUE "InternalName","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "LegalCopyright","Copyright APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "LegalTrademarks","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "OriginalFilename","APP.exe\000"   >> aVersionInfo.rc
ECHO.       VALUE "ProductName","APP\000"   >> aVersionInfo.rc
ECHO.       VALUE "ProductVersion,"1\000"   >> aVersionInfo.rc
ECHO.       VALUE "Comments","Compiled on %date% by %username%\000"   >> aVersionInfo.rc
ECHO.     END   >> aVersionInfo.rc
ECHO.   END   >> aVersionInfo.rc
ECHO.   BLOCK "VarFileInfo"   >> aVersionInfo.rc
ECHO.   BEGIN   >> aVersionInfo.rc
ECHO.     VALUE "Translation", 0x0809 1200   >> aVersionInfo.rc
ECHO.   END   >> aVersionInfo.rc
ECHO. END   >> aVersionInfo.rc
ENDLOCAL

Пакетный файл выполняется как часть компиляции, aVersionInfo.rc обновляется, aVersionInfo.res перекомпилируется, но по какой-то причине новый файл res не используется для компиляции исполняемого файла. Однако он обновляется во время чистой сборки или если я компилирую второй раз. Кажется, проверка на наличие изменений в файлах rc происходит до того, как будут вызваны события pre-build. Что на самом деле делает его событием среднего уровня. Или я что-то упустил?

Я попытался удалить файл aVersionInfo.res как еще одно событие перед сборкой, но затем компилятор жалуется, что этот файл отсутствует. Может ли быть так, что

{$R 'aVersionInfo.res' 'aVersionInfo.rc'}

строка находится не в том месте?

Ответы [ 5 ]

9 голосов
/ 18 января 2010

Попробуйте использовать

{$R aVersionInfo.res}

и вызов brcc32 aVersionInfo.rc вручную из командного файла (после того, как вы закончите с созданием файла .rc). Таким образом, ваш файл .res должен быть исключен из обычной сборки IDE.

1 голос
/ 18 января 2010

Может быть отсутствует ["]
ECHO. ЗНАЧЕНИЕ «ProductName», «APP \ 000» >> aVersionInfo.rc
ECHO. ЗНАЧЕНИЕ "ProductVersion", "1 \ 000" >> aVersionInfo.rc
------- ЗДЕСЬ ----------------------- ^
ECHO. ЗНАЧЕНИЕ "Комментарии", "Скомпилировано в% date% по% username% \ 000" >> aVersionInfo.rc Bye

0 голосов
/ 03 сентября 2015

TL; DR:

Поместите строку {$R 'aVersionInfo.res' 'aVersionInfo.rc'} непосредственно под оператором Program один раз , затем выполните построение. Или используйте BRCC32 для принудительной первой сборки файла .RES

.

Длинная версия:

Ваше предположение, что строка:

{$R 'aVersionInfo.res' 'aVersionInfo.rc'}

находится в неправильном месте частично правильно.

Когда я изначально настроил использование файла .RC в Delphi XE2, у меня возникла та же проблема с немного другим кодом, иногда компилируемым, а иногда нет. Я пробовал варианты как:

{$R 'aVersionInfo.res' 'aVersionInfo.rc'}
{$R '.\aVersionInfo.res' '.\aVersionInfo.rc'}

но компилятор XE2 продолжал жаловаться на то, что файл RES не был найден, если его там действительно не было (обратите внимание, что это была моя первоначальная сборка).

Оказывается, сначала нужно поместить эту строку непосредственно под оператором Program :

program TTClient;
{$R 'VersionInfo.res' 'VersionInfo.rc'}

... а не рядом с вашим уже присутствующим

{$R *.res}

Затем вы строите свою программу один раз .

После этого вы можете переместить строку обратно в более логичное место:

{$R *.res}
{$R 'VersionInfo.res' 'VersionInfo.rc'}

По какой-то странной причине, когда Delphi «знает», что файл .rc является частью проекта, он больше не имеет значения, если вы тоже:

  • разместите строку в другом месте
  • есть файл .res или нет

Нет необходимости в прекомпиляции. Если файл .RC изменен, компилятор перестроит файл .RES, независимо от того, существовала более ранняя версия или нет.

Это странное поведение не очень помогает при первоначальной настройке этой системы ; - (

Есть и другие странные вещи, происходящие с анализом исходного кода проекта и созданием файла .dproj, который привел меня к этому решению, а именно:

Если вы переименуете файл .rc, это может снова вызвать у вас проблемы: в файле .dproj есть остатки, все еще указывающие на старый файл .rc, и компилятор пожалуется на то, что не нашел его. Вы должны отредактировать это старое имя из файла .dproj, чтобы это исправить.

Обратите внимание, что все это было под XE2, под другой версией YMMV .


Отредактировано, чтобы добавить: Возможно, вам все еще придется сражаться с Информация о версии XE2 не работает проблема.

0 голосов
/ 18 января 2010

Вы можете вызвать brcc32 внутри командного файла, чтобы он всегда обновлял файл .res. Я делаю что-то подобное, и это работает как в компиляции, так и в сборке.

0 голосов
/ 18 января 2010

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

touch VersionInfo.pas

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

...