вторник, 6 июля 2010 г.

MSBuild и Visual Studio 2008

Консольная утилита автоматической сборки MSBuild.exe не работает с файлами сборки Visual Studio 2008, выдавая ошибку:

Solution file error MSB5014: File format version is not recognized. MSBuild can only read solution files between versions 7.0 and 9.0, inclusive

и сообщая нам, что будет работать с файлами сборки версий с 7.0 по 9.0 (2005). Источник проблемы здесь вот в чем. По умолчанию используется MSBuild от .NET Framework версии 2.0, который не понимает солющены от VS 2008.
Так как MSBuild активно используется в крупных проектах и в TFS, то проблема как минимум неприятная.

Бороться с этим можно несколькими способами:

1. Обманываем MSBuild, сообщая ему другую версию файла сборки
На самом деле, утилите абсолютно параллельна разница между файлами sln версии 9 и 10. Поэтому достаточно открыть файл на редактирование и подменить номер версии, и все будет отлично работать.

Способ описан здесь:
http://tfsnow.wordpress.com/2007/08/22/building-visual-studio-2008-under-team-build-2005/
Открываем любым редактором файл sln и в первой же строчке заменяем
Microsoft Visual Studio Solution File, Format Version 10.00

на
Microsoft Visual Studio Solution File, Format Version 9.00

После этого MSBuild сможет обработать такую сборку. Но перед редактированием в IDE нужно не забыть вернуть все назад.
Естественно, для автосборки все это можно автоматизировать, например bat файлом

2. Используем саму среду devenv для консольной сборки вместо MSBuild

Мне предыдущий способ показался слишком неудобным. Как альтернатива, вместо использования MSBuild можно использовать devenv.exe в консольном режиме. Находим в проекте сборки команды, делающие build, rebuild и clean. Они могут быть похожи на такие:

msbuild.exe /t:build /p:Configuration=$(ConfigurationName) /p:Platform=$(PlatformName) SolutionFile.sln
msbuild.exe /t:rebuild /p:Configuration=$(ConfigurationName) /p:Platform=$(PlatformName) SolutionFile.sln
msbuild.exe /t:clean /p:Configuration=$(ConfigurationName) /p:Platform=$(PlatformName) SolutionFile.sln

и заменяем на соответствующие:

devenv.exe /Build "$(ConfigurationName)|$(PlatformName)" SolutionFile.sln
devenv.exe /Rebuild "$(ConfigurationName)|$(PlatformName)" SolutionFile.sln
devenv.exe /Clean "$(ConfigurationName)|$(PlatformName)" SolutionFile.sln

Если сборка производится с помощью bat файла, тогда все еще проще.
Полностью отказаться от MSBuild не всегда получается, так как она поддерживает сборочные скрипты. Кроме того, этот метод не проверялся с TFS.
Зато перед сборкой никакие файлы не нужно править.

3. Удаляем "неправильную" версию MSBuild.exe
Сделайте поиск файла MSBuild.exe по директории \Windows. У меня, например, нашлось 2 файла:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe

дело за малым: нужно либо удалить, либо переименовать файл MSBuild.exe, который находится в директории .NET Framework версии 2.0. После этого система от безвыходности начнет использовать "правильный" файл из .NET версии 3.5.
Вероятно, это самый правильный способ, особенно для TFS. Но недостаток у него тоже есть, в частности для локальных проектов, использующих MSBuild. Проекты будут собираться только у вас на машине, а коллега-программист, которому вы передадите код, столкнется с этой же ошибкой и должен будет тоже все это прочитать...

Комментариев нет:

Отправить комментарий