Использование MSBuild для обновления FILEVERSION в файле ресурсов C ++ приводит к ошибкам компиляции - PullRequest
7 голосов
/ 10 февраля 2010

Мне было поручено автоматизировать процесс сборки с помощью msbuild. У нас есть около двадцати проектов Visual C ++ и двадцать проектов C #, поэтому редактирование всех строк версий затруднительно. Наши номера версий создаются во время сборки, поэтому нам нужно передать полную строку версии в качестве свойства в командной строке.

Моя первоначальная реализация использовала задачу MSBuild Extension Pack File для замены файлов .rc и AssemblyInfo.cs.

<FileSystem.File TaskAction="Replace" Files="@(AssemblyInfoFiles)" RegexPattern='\[assembly: AssemblyVersion\(".*"\)\]' Replacement='[assembly: AssemblyVersion("$(Version)")]'/>
<FileSystem.File TaskAction="Replace" Files="@(AssemblyInfoFiles)" RegexPattern='\[assembly: AssemblyFileVersion\(".*"\)\]' Replacement='[assembly: AssemblyFileVersion("$(Version)")]'/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern="FILEVERSION\s+\S+" Replacement="FILEVERSION $(Version)"/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern="PRODUCTVERSION\s+\S+" Replacement="PRODUCTVERSION $(Version)"/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern='VALUE\s+"FileVersion",\s*".*"' Replacement='VALUE "FileVersion", "$(Version)"'/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern='VALUE\s+"ProductVersion",\s*".*"' Replacement='VALUE "ProductVersion", "$(Version)"'/>

Это прекрасно работает с файлами AssemblyInfo.cs, но когда я компилирую любой из проектов C ++, я получаю такие ошибки:

.\MyProject.rc(23): error RC2135: file not found: 0x09
.\MyProject.rc(71): error RC2135: file not found: 1
.\MyProject.rc(72): error RC2135: file not found: 6
.\MyProject.rc(73): error RC2135: file not found: 6
.\MyProject.rc(74): error RC2135: file not found: 0x3fL
.\MyProject.rc(80): error RC2135: file not found: FILEOS
.\MyProject.rc(81): error RC2135: file not found: 0x2L
.\MyProject.rc(84): error RC2164: unexpected value in RCDATA
.\MyProject.rc(86): error RC2135: file not found: BLOCK
.\MyProject.rc(88): error RC2135: file not found: VALUE

Первая ошибка встречается в строке 23, но когда я проверяю MyProject.rc против управления исходным кодом, все выглядит нормально. Изменяются только номера версий, эти изменения начинаются со строки 72, и строка 0x09 нигде в файле не появляется. Что в мире здесь происходит? Строки 21 - 25 выглядят так:

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32

Я также открыт для любых предложений относительно других методов достижения той же цели.

Ответы [ 3 ]

6 голосов
/ 23 февраля 2010

Операция Replace TaskAction вставляла символы Unicode, в то время как файлы rc используют кодировку ASCII. Добавление TextEncoding = "ASCII" ко всем задачам замены rc приводит к скомпилированным файлам.

Ограничением использования набора символов ASCII является то, что вы не можете использовать символ ©. Но если вы выберете TextEncoding = "Windows-1252", это решит проблему.

4 голосов
/ 12 февраля 2010

Я бы отделил информацию о версии от файлов AssemblyInfo.cs и *.rc. Создайте файл AssemblyVersion.cs и Version.rc, который содержит (общую) информацию о версиях для всех ваших сборок. Вы сгенерируете их в начале сборки. Поскольку они содержат только информацию о версиях, которую вы не должны использовать в регулярных выражениях, вы можете каждый раз перезаписывать весь файл.

3 голосов
/ 20 октября 2011

Вам все еще нужно заменить точки (.) в FILEVERSION запятыми (,). Если вы соберете без правильного формата, вы не увидите версию файла в свойствах файла | страница деталей. Я бы пошел дальше и сделал бы то же самое для PRODUCTVERSION, хотя в этом нет необходимости.

Я использовал MSBuild Функции свойств . Я уверен, что вы также можете откорректировать / заменить их.

<FileSystem.File TaskAction="Replace" 
                 TextEncoding="ASCII" 
                 Files="@(AppResource)" 
                 RegexPattern="FILEVERSION\s+\S+" 
                 Replacement="FILEVERSION $(Version.Replace('.',','))"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...