Репозиторий с утилитой «Скрипт-анализатор для поиска нелегалов».
Утилита позволяет найти в коде разработки Directum RX запрещенные конструкции. Чтобы произвести проверку, нужно запустить .bat файл прописав в нем необходимые параметры:
-
-all all, при указании которого выводятся все найденные конструкции описанные ниже, без него, только критичные ситуации.
-
-path "Путь до проверяемой папки", папка в которой необходимо проверить файлы на присутствие запрещенных конструкций.
Результат работы утилиты выводится в консоль. При необходимости поток выводимых данных можно перенаправить в текстовый файл. Пример выполнения:
chcp 1251 && powershell.exe -executionpolicy unrestricted -File .\GetIllegals.ps1 -all all -path .\Work > .\logger.txt
Также есть возможность использования данного скрипта при коммите. В этом случае, при его выполнении, будут выведены имена фиксируемых файлов в которых найдены запрещенные конструкции, и при обнаружении критичных нелегалов, коммит будет отменяться.
Note
Замечания и пожеланию по развитию шаблона разработки фиксируйте через Issues. При оформлении ошибки, опишите сценарий для воспроизведения. Для пожеланий приведите обоснование для описываемых изменений - частоту использования, бизнес-ценность, риски и/или эффект от реализации.
Внимание! Изменения будут вноситься только в новые версии.
Критичные:
- Remote-функции в "Обновлении формы".
- Remote-функции и получение сущностей через Get, GetAll в "Возможности выполнения действий".
Средней критичности:
- Создание, удаление, получение сущностей через Get и GetAll не в серверном коде.
- Использование анонимных типов.
- Приведение к типу через is, as.
- Использование запрещенных класов .Net.
Скрипт не имеет инсталлятора. Установка не требуется.
Для проверки необходимо:
- Склонировать репозиторий.
- Изменить файл run.bat, указав в нем необходимые параметры.
- Запустить утилиту с помощью run.bat, посмотреть результат работы.
Для использования при коммите:
- Склонировать репозиторий.
- Скопировать GetIllegals.ps1 в папку с репозиторием для которого необходимо настроить проверку, а pre-commit в папку .git\hooks данного репозитория.
- Внести файл GetIllegals.ps1 в файл .gitignore.
Для модификации скрипта требуется наличие на рабочем месте разработчика интегрированной среды сценариев PowerShell ISE.
Модификация выполняется за счет разработки новых функций для поиска нелегалов с помощью регулярных выражений. Например, мы хотим добавить поиск серверных функций в "Обновлении формы." Для этого:
- Необходимо получить все файлы из родительской папки. В данном случае файл будет иметь в имени "Handlers", и так как данный код относится к клиентскому, то полный путь будет содержать "ClientBase".
$refreshFiles = Get-ChildItem -Include *.cs -Exclude *.g.cs, *g.i.cs -Recurse | ? { $_.FullName -match '\w*.ClientBase.*(Handlers)' }
- Разработать функцию для поиска серверных функций в обработчике события "Обновление формы". Установить факт вызова серверной функции из клиентского кода можно по аттрибуту "Remote". Поэтому реализуем регулярное выражение для поиска подобных конструкции, и если они есть, то выведем имя файла.
function Get-FilesRefreshIllegal ($file)
{
$result = 0
$content = Get-Content $file.FullName | % { $contentstring += $_ }
$illegal = $contentstring | Select-String -Pattern ' Refresh\(.*?(Remote|public)' -AllMatches -CaseSensitive
if ($illegal.Count -ne 0)
{
foreach ($match in $illegal.Matches)
{
if($match.Value -ne $null -and $match.Value.Contains("Remote"))
{
Write-Host $file.FullName
$result = 1
}
}
}
return $result
}
- Пройтись в цикле по всем отфильтрованным файлам в пункте 1, функцией разработанной на шаге 2.
foreach($file in $refreshFiles)
{
$result = Get-FilesRefreshIllegal($file)
if ($result -eq 1)
{
$exitcode = 1;
}
}
В примере выше реализована возможность блокировки коммита при найденных нелегалах. Если такая функиональность не нужна, необходимо сократить код.
function Get-FilesRefreshIllegal ($file)
{
$content = Get-Content $file.FullName | % { $contentstring += $_ }
$illegal = $contentstring | Select-String -Pattern ' Refresh\(.*?(Remote|public)' -AllMatches -CaseSensitive
if ($illegal.Count -ne 0)
{
foreach ($match in $illegal.Matches)
{
if($match.Value -ne $null -and $match.Value.Contains("Remote"))
{
Write-Host $file.FullName
}
}
}
}
foreach($file in $refreshFiles)
{
Get-FilesRefreshIllegal($file)
}