- PVSM.RU - https://www.pvsm.ru -

Как увидеть связи внутри вашего PowerShell модуля

День добрый, коллеги. Сто лет назад где-то описывал быстрый и "грязный" способ увидеть граф вызовов внутри вашего PowerShell скрипта. Теперь, пришла, так сказать, пора, натянуть сову на глобус и посмотреть граф зависимостей внутри модуля.

Прежде всего, нудно установить PSQuickGraph module [1] из Powershell Gallery. И следом за этим запустить скрипт, базу которого можно взять вот тут [2]. Честно говоря, я не совсем понял, как вставить код из gist в пост на хабре. Если кто подскажет в коментах, буду премного благодарен.

Итак, продолжим. Прежде всего, в двух словал про сам модуль. Он строится на библиотеке QuickGraph [3]. По сути, это PowerShell обертка над библиотекой, которая предназначена для быстрых и грубых тестов с графами. Одним из таких тестов может быть штука, которая разбирает ваш PowerShell код, генерирует из него граф связей, и представляет его визуально.

Кроме того, в самом скрипте используется встроенный в PowerShell механизм доступа к его AST [4] что, собственно, значительно упрощает нам разбор кода. В конечном итоге скомбинировав одно и другое мы получаем граф.

В итоге, сам скрипт состоит из двух частей. Куска "парсера", работающего с AST, и части, которая соственно связывает AST и граф. Эта часть описана на следующем примере

# создаем экземпляр графа (модуль PSQuickGraph)
$g = New-Graph -Type BidirectionalGraph
# парсим PS1 файлы, выгребаем AST и добавляем функции как вершины в граф
$f = dir "C:RepoWorkTools*.ps1" -Recurse | Find-Function
$f.name | % { Add-Vertex -Vertex $_ -Graph $g}

# бежим второй раз, и добавляем вершины там, где происходят вызовы функций модуля и взяких других командлетов, которые нам могут быть интересны
$f | % {
    $fName = $_.name
    $tmpFile = New-TemporaryFile
    $_.line >> ($tmpFile.fullname)
    $expr = Find-Expression -Fullname $tmpFile.fullname
    $expr.name | ? {$_} | ? {$_ -notin "%","where","?","select","out-null","sort","ft","fl","Write-Verbose" } | % { Add-Edge -From $fName -to $_ -Graph $g}
}

# отображаем граф
Show-GraphLayout -Graph $g

# сохраняем его в формате DOT
Export-Graph -Format Graphviz -Graph $g -Path C:Tempg.gv

Ну и, примерно вот так это выглядит в результате

moduleStructure

Кроме этого, последняя команда экспортирует граф в формат DOT, что позволяет помучать его еще в приложении graphviz [5]

Автор: eosfor

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/powershell/294701

Ссылки в тексте:

[1] PSQuickGraph module: https://www.powershellgallery.com/packages/PSQuickGraph/1.1

[2] вот тут: https://gist.github.com/eosfor/e66b1bb2c4d7fa5279dc1ffbcfd6f205

[3] QuickGraph: https://archive.codeplex.com/?p=quickgraph

[4] AST: https://en.wikipedia.org/wiki/Abstract_syntax_tree

[5] graphviz: https://www.graphviz.org

[6] Источник: https://habr.com/post/425225/?utm_campaign=425225