h_323 (h_323) wrote,
h_323
h_323

Отладка msbuild-скрипта при помощи PowerConsole

Поставил студию MSVS11 Beta. И через некоторое время узнал, что в MSVS10 C#-проекты перестали собираться с MSBuild'овскими ругательствами. Предпринята попытка с отладкой компиляции. Возникла проблема отображения переменных. Смотреть в Locals не слишком удобно большие коллекции, которые к тому же постоянно растут. Поэтому воспользовался Powershell'ом

PS> $dte.Debugger.GetExpression("Project")
PS> $dte.Debugger.GetExpression("Environment")
PS> $dte.Debugger.GetExpression("Toolset")
PS> $dte.Debugger.GetExpression("Global")
PS> $dte.Debugger.GetExpression("Properties")

Есть еще в окне Locals переменная "Built In", к которой не удалось доступиться. Похоже, что из-за пробела.

Можно посмотреть, уже конкретные переменные. Вот, просто выводим список:
PS> $a = $dte.Debugger.GetExpression("Project")
PS> $a.DataMembers

DataMembers имеет тип EnvDTE.Expressions (link)
А теперь обращаемся по индексу:
PS> $a.DataMembers.Item(1)
А теперь — по имени:
PS> $a.DataMembers |? {$_.Name -eq "Properties" }

Кстати, во время отладки переменные протухают (после каждого шага дебаггера)


Вот получаем набор всех имён, всех полей проекта:
PS> $a.DataMembers |% {$_.Name}
DefaultTargets
Directory
FullPath
GlobalProperties
InitialTargets
IsImmutable
ItemDefinitions
Items
ItemTypes
ProjectFileLocation
Properties
Targets
ToolsVersion
Non-Public members

Предположительно, меня интересуют properties (доступаются в виде $(property)) и items (доступаются в виде %(item))

PS> ($a.DataMembers |? { $_.Name -eq "Properties" }).DataMembers |% {$_.Name}
[Microsoft.Build.Collections.ReadOnlyCollection<Microsoft.Build.Execution.ProjectPropertyInstance>]
Count
IsReadOnly


Интересует первый параметр с дебильным именем в квадратных скобках (где-то там как раз и содержится коллекция пропертей). Поскольку коллекции здесь индексируются, начиная с 1, то и получаем:

PS> ($a.DataMembers |? { $_.Name -eq "Properties" }).DataMembers.Item(1).DataMembers|% {$_.Name}
Count
IsReadOnly
Non-Public members


А здесь нас уже интересует мембер Non-Public members. Ну и т.д. Итого:
PS> $properties = ((($a.DataMembers |? { $_.Name -eq "Properties" }).DataMembers.Item(1).DataMembers|? {$_.Name -eq "Non-Public members" }).DataMembers |? {$_.Name -eq "backing"}).DataMembers
PS> $items = ((($a.DataMembers |? { $_.Name -eq "Items" }).DataMembers.Item(1).DataMembers|? {$_.Name -eq "Non-Public members" }).DataMembers |? {$_.Name -eq "backing"}).DataMembers


Удобнее будет это оформить в виде функций:
PS> Function get-properties () {
>>  (
>>    (
>>      ( $dte.Debugger.GetExpression("Project").DataMembers |? { $_.Name -eq "Properties" }
>>      ).DataMembers.Item(1).DataMembers |? {$_.Name -eq "Non-Public members" }
>>    ).DataMembers |? {$_.Name -eq "backing"}
>>  ).DataMembers
>>  }

PS> Function get-project-items () {
>>  (
>>    (
>>      ( $dte.Debugger.GetExpression("Project").DataMembers |? { $_.Name -eq "Items" }
>>      ).DataMembers.Item(1).DataMembers|? {$_.Name -eq "Non-Public members" }
>>    ).DataMembers |? {$_.Name -eq "backing"}
>>  ).DataMembers
>>  }

Не сказать, чтобы уж очень удобный способ обращаться к мемберам. Но зато можно потом будет наавтоматизировать всласть. Формат представления пропертей некрасивый. Вот запрос, чтобы узнать значение свойства PlatformTarget:
PS> (get-properties |? {$_.Value -like """PlatformTarget""*"}).Value
"PlatformTarget"="x86"
Tags: debugging, msvs, powerconsole, powershell
  • Post a new comment

    Error

    default userpic
  • 0 comments