Событие предварительной сборки работает в Windows 7, не работает в XP - PullRequest
3 голосов
/ 22 июня 2011

У меня есть событие перед сборкой, настроенное для генерации номера версии / сборки для встраивания в мой exe-файл. Событие состоит из вызова пакетного файла, который выполняет фактическую работу (параметр передается в пакетный файл). Пакетный файл работает должным образом на всех компьютерах, на которых я его пробовал, включая компьютеры с Windows XP. Он также отлично работает как событие предварительной сборки на 3 компьютерах, работающих под управлением Windows 7. Однако событие предварительной сборки завершается неудачно в Windows XP. Delphi возвращает код ошибки, на который я нигде не могу найти ссылку, «20018».

Я безуспешно пробовал разные варианты способа вызова командного файла. У кого-нибудь есть идеи, что происходит?

Событие сборки выглядит следующим образом:

call "..\..\Build Tools\PreBuild.bat" "$(PROJECTDIR)"

UPDATE: Я удалил источник командного файла, так как он не имел отношения к реальной проблеме.

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

Хорошо, я наконец нашел ответ здесь: http://delphi.about.com/od/devutilities/a/pre_post_build.htm

Проблема заключалась в пробелах в пути к вызываемому пакетному файлу. Очевидно, это не проблема в Windows 7.

Удаление пространства в каталоге инструментов сборки и изменение события предварительной сборки на следующее решило проблему:

call ..\..\BuildTools\PreBuild.bat "$(PROJECTDIR)"

Вот важный бит из ссылки:

Командная строка: это самая хитрая из всех, но после того, как вы запустили одну из них, с ними все просто. Хитрость здесь не в том, чтобы использовать кавычки в имени программы, а вместо этого использовать Windows SFN (короткое имя файла). Причина в том, что, если вам нужно использовать кавычки, чтобы указать путь к вашему файлу, в среде IDE возникает слишком много кавычек. Итак, это неправильные способы добавления этой командной строки выше:

C: \ Program Files \ SoftwarePassport \ Armadillo.exe D: \ Dev \ My Prog \ Prot.arm / P

«C: \ Program Files \ SoftwarePassport \ Armadillo.exe» D: \ Dev \ My Prog \ Prot.arm / P

C: \ Program Files \ SoftwarePassport \ Armadillo.exe "D: \ Dev \ My Prog \ Prot.arm" / P

"C: \ Program Files \ SoftwarePassport \ Armadillo.exe" "D: \ Dev \ My Prog \ Prot.arm" / P

Этот последний должен работать, если бы не было перепутано с IDE. Итак, что работает, то один из них: C: \ Progra ~ 1 \ Softwa ~ 1 \ Armadillo.exe "D: \ Dev \ My Prog \ Prot.arm" / P

C: \ Progra ~ 1 \ SoftwarePassport \ Armadillo.exe "D: \ Dev \ My Prog \ Prot.arm" / P

2 голосов
/ 22 июня 2011

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

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

Например, у меня часто возникают проблемы на машинах XP, использующих команды XCOPY на этапах после сборки, и эти команды часто приводят к действительно странным кодам ошибок, которые я не могу диагностировать или определить значение. Поэтому, если у вас есть команда XCOPY, вы должны попробовать XCOPY внутри и вне среды сборки и посмотреть, работает ли она, например, на этом Windows XP.

Вы можете скопировать команды по мере их выполнения в их макросы, развернутые в виде вкладки «Вывод» в IDE Rad Studio, вставить их в блокнот, запустить их как командный файл и попытаться выяснить, почему они не работают на Windows XP.

Вот пример обходного решения с использованием XCOPY. Если это не сработает на XP, я подправлю его, пока он не заработает:

 XCOPY  SourceDir DestDir

Мне пришлось исправить это так:

 XCOPY.exe  SourceDir DestDir

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

 call XCOPY SourceDir DestDir

Вы также упоминаете, что просто запускаете таинственный пакетный файл и не упоминаете, что он делает. Итак, давайте посмотрим, что мы можем сделать по-другому, чтобы запустить пакетный файл с шага после сборки .... Когда я запускаю такой пакетный файл, у меня иногда возникают проблемы в XP, например:

batchfilename.cmd

Но когда я запускаю его по-другому, я вижу, что он работает на XP, но я теряю вывод командной строки:

call batchfilename.cmd

Казалось, что при выполнении шагов после сборки в IDE происходит что-то странное, что может быть решено с помощью команд вне среды IDE в различных формах.

Упомянутое вами число (20018) - это глупая вещь, чтобы поискать в Google, это, вероятно, ERRORLEVEL (возвращаемое значение в командной оболочке) любого инструмента, который вы используете в своем пакетном файле. Поскольку вы ничего не сказали нам о том, какие инструменты вы используете, мне интересно, сделали ли вы хотя бы базовый шаг, чтобы посмотреть, что происходит, когда вы запускаете этот пакетный файл ВНЕ IDE на этом компьютере с XP. Я предполагаю, что если он не пришел из вашего собственного пакетного файла, то он пришел из глубины самого MSBUILD, который очень немногие люди Delphi будут знать исходный код (даже сама команда Delphi использует двоичный файл от Microsoft для обеспечения функциональности MSBUild). Я заметил, что встроенные в MSBUILD задачи для выполнения шагов после сборки и перед сборкой являются областью среды IDE, которая нуждается в улучшении, особенно когда речь идет об устранении подобных проблем. Однако вы можете просто запустить их вне IDE и посмотреть, работают ли они таким образом, и вы можете попробовать что-то, как я предлагал выше.

Если это ваш пакетный файл ... Я полагаю, что из-за проблем с зависимостями вы можете не захотеть использовать такой метод пакетного файла для изменения файла RC, так как это может показать некоторую странную зависимость проблемы в MSBUILD с задачами сборки RAD / Delphi. Я также видел некоторые странные сбои BRCC32 в XP, которые мне не удалось воспроизвести.

...