Подтвердить что ты не робот

Событие предварительной сборки Delphi не выполняется перед компиляцией

Я занят автоматизацией наших сборников, чтобы включить номер версии svn. Мы используем Delphi 2010. Я добавил событие pre-build, вызывающее командный файл, который вводит номер версии 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 не используется для компиляции exe. Тем не менее, он обновляется во время чистой сборки или если я компилирую второй раз. Кажется, проверка изменений в файлах rc происходит до того, как вызываются события "pre" -build. Что на самом деле делает его событием средней сборки. Или я чего-то не хватает?

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

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

строка не в том месте?

4b9b3361

Ответ 1

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

{$R aVersionInfo.res}

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

Ответ 2

Возможно, отсутствует ["]
ECHO. VALUE "ProductName", "APP\000" → aVersionInfo.rc
ECHO. VALUE "ProductVersion," 1\000" → aVersionInfo.rc
------- ЗДЕСЬ ----------------------- ^
ECHO. VALUE "Комментарии", "Скомпилировано по дате%%% от имени пользователя%\000" → aVersionInfo.rc Bye

Ответ 3

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

touch VersionInfo.pas

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

Ответ 4

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

Ответ 5

TL; DR:

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

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

Предположим, что строка:

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

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

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

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

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

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

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 Version Not Working.