23 октября 2017 г.

Msbuild debugging. Отладка csproj скрипта проекта в Visual Studio.

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

Но выход есть! Скрипт MsBuild можно отлаживать, ставить breakpoints и смотреть значения переменных. Приведу ссылку на исходную статью Debugging MSBuild script with Visual Studio а тут опишу действия на примере Visual Studio 2015 и некоторые особенности.

Сборку и отладку придется запускать через командную строку msbuild.exe используя опцию /debug, но изначально данная функция не доступна, поэтому при попытке воспользоваться ключом будет ошибка:

D:\!Blog\DebugFeatures\DebugFeatures>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /debug DebugFeatures.csproj
Microsoft (R) Build Engine version 4.6.1055.0
[Microsoft .NET Framework, version 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.

MSBUILD : error MSB1001: Unknown switch.
Switch: /debug

For switch syntax, type "MSBuild /help"

Поэтому потребуется:
  • Сначала нужно добавить в ветку реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\4.0 значение DebuggerEnabled = true. На компьютере могут стаять две версии .NET Framework - под x64 и x86 поэтому для обоих свои ветки реестра. В статье выше указан путь только к одной ветке, поэтому я приведу текст написанного мной скрипта, который добавит это значение в оба места.

    SET FrameworkDir=%windir%\Microsoft.NET\Framework
    SET FrameworkDir64=%windir%\Microsoft.NET\Framework64
     
    SET Cmd32Exe=%windir%\System32\cmd.exe
    SET Cmd64Exe=%windir%\SysWOW64\cmd64.exe
     
    IF EXIST %FrameworkDir% (
     start %Cmd32Exe% /c "reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\4.0" /v DebuggerEnabled /d true"IF EXIST %FrameworkDir64% (
     start %Cmd64Exe% /c "reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSBuild\4.0" /v DebuggerEnabled /d true"
    )
    
    Для запуска скопируйте в блокнот, сохраните как AnyName.bat, затем запустите.
    
  • Затем идём в студию, выбираем проект и в контекстном меню выбираем пункт "Unload Project", проект должен стать "Недоступным":

  • Далее для запуска отладчика пишем в командной строке "Путь\msbuild.exe" /debug "Путь\MyProject.csproj", запускаем и должны увидеть:

  • Стоит так же учитывать номер Target Framework вашего проекта и указывать верную директорию C:\Windows\Microsoft.NET\Framework\XXXXXXXX\msbuild.exe, иначе будьте готовы к тому, что в студии всё будет собираться, а из командной строки нет. Если версия Framework понятна, то советую сначала убедиться, что в студии и через найденный msbuild.exe ошибок не возникает при сборке.
  • В диалоговом окне выбора отладчика выбираем либо новый экземпляр студии, либо уже запущенный, и вуалям! Можем использовать F10 и breakpoints:

Случаи на работе, когда это пригодилось:
  • В одном из проектов писалась встроенная Task для получения ChangeSet номера папки с проектом из TFS и последующая подстановка в версию файла. Тем самым тестировщик каждую сборку имел правильную версию файлов.
    Вы спросили, почему тестировщик этим занимается? Дело в том, что по нормальному этим занимается какой то Build Service, но такого не было и сборка и обновление делалось вручную.
  • Имелась утилита собирающая Msbuild скрипт, который наполнялся и создавал ClickOnce приложение. Отладка его сценариев таким образом здорово мне помогло.

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

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