https://github.com/ivnstn/teamtools.linter.commandline
Static code analysis tool for T-SQL scripts and SSDT projects
https://github.com/ivnstn/teamtools.linter.commandline
code-analysis-tool code-quality code-smell database linter rdl sql-server ssdt static-analysis tsql
Last synced: about 2 months ago
JSON representation
Static code analysis tool for T-SQL scripts and SSDT projects
- Host: GitHub
- URL: https://github.com/ivnstn/teamtools.linter.commandline
- Owner: IVNSTN
- License: mit
- Created: 2025-11-06T08:50:03.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2025-11-18T13:50:49.000Z (about 2 months ago)
- Last Synced: 2025-11-18T15:56:41.243Z (about 2 months ago)
- Topics: code-analysis-tool, code-quality, code-smell, database, linter, rdl, sql-server, ssdt, static-analysis, tsql
- Language: C#
- Homepage:
- Size: 85 KB
- Stars: 5
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
# TeamTools Linter CommandLine
Утилита командной строки для выполнения линтинга с поддержкой подключаемых плагинов.
## Плагины
Например, IVNSTN/TeamTools.Linter.TSQL для статического анализа кода на **T-SQL**.
Перечень плагинов необходимо указать в [конфигурационном файле](./TeamTools.Linter.CommandLine/DefaultConfig.json).
## Параметры
|Параметр|Сокращение|Описание|
|-|-|-|
| `--config`| `-c` | Путь к конфигурационному файлу
| `--dir` | `-d` | Путь к директорию, все файлы которой нужно линтить
| `--file` | `-f` | Путь к одному файлу, который нужно линтить
| `--filelist` | `-l` | Путь к текстовому файлу, в котором перечислены один или несколько полный путей к файлам, которые нужно линтить.
| `--output` | `-o` | Путь к файлу, в который нужно сохранить результат либо `console` для выдачи обнаруженных замечаний в терминал.
| `--format` | `-m` | В каком виде оформить результат: json, sonar или text. Параметр учитывается только если в `output` указан путь к файлу для сорахнения результата.
| `--severity` | `-s` | Минимальный уровень серьезности замечаний, которые должны быть учтены в результате линтинга. По умолчанию - info, то есть все ошибки (error), предупреждения (warning), предложения и информационные сообщения (info или hint). Если требуются только серьёзные замечания, то необходимо передать значение warning (явные ошибки и предупреждения) или error (только явные ошибки). Серьезность замечаний по каждому нарушенному правилу указывается в конфигурации плагина.
| `--basepath` | `-r` | Базовый путь к файлам. Если указан, то вместо абсолютных путей к файлам в логе и в итоговом файле будут указаны относительные пути с базой, заданной в этом параметре.
| `--verbose` | `-v` | Выводить подробности о ходе выполнения линтинга в консоль
| `--withversion` | `-n` | Перед выдачей результата в консоль сначала напечатать номер версии. При вызове с параметром `--version` никаких других действий выполняться не будет. А с параметром `--withversion` можно и линтинг запустить, и текущую версию сразу в логе увидеть.
| `--diff` | | Линтить все файлы, отличающиеся от ветки master. Работает только при запуске на файлах, размещенных в GIT-репозитории. Путь к git.exe должен быть включен в PATH. Вместо этого параметра схожего эффекта можно добиться, предварительно вычислив набор файлов, подлежащих линтингу. Этот список полных путей к файлам нужно сохранить в простой текстовый файл и путь к нему передать в параметре `--filelist`
| `--quiet` | | Не устанавливать ненулевой код возврата в случае обнаружения замечаний линтера
| `--version` | | Вывести номер версии утилиты без выполнения других операций
| `--help` | | Отобразить список параметров
## Примеры вызова
### Линтинг диффа по каталогу
```cmd
.\TeamTools.Linter.CommandLine.exe --dir "c:\source\my_project" --diff
```
Дифф вычисляется по Git относительно главной ветки, в итоге сканируются только изменённые файлы. Имя главной ветки можно указать в конфигурационном файле.
### Линтинг конкретного файла
```cmd
.\TeamTools.Linter.CommandLine.exe --file "c:\source\my_project\Stored procedures\dbo.my_proc.sql"
```
### Линтинг всех файлов директории без учета info-сообщений
```cmd
.\TeamTools.Linter.CommandLine.exe --dir "c:\source\my_project" --severity warning
```
## Интеграция
Утилитой можно пользоваться напрямую, вызывая её в терминале, а можно встроить в некоторые инструменты.
### SSMS External Tool
Выполнить линтинг файла, открытого в текущей вкладке SSM можно с помощью настраиваемого пункта меню.
Для создания нового пункта меню зайдите в Tools / External Tools, добавьте новый элемент и настройте как показано ниже.
```ini
Command = \TeamTools.Linter.CommandLine.exe
Arguments = --file $(ItemPath) --with-version
Initial directory = <пусто>
Use output window = поставьте галочку
```
в поле "Arguments". В поле "Initial directory" введите путь к директории с исполняемым файлом линтера (такой же как в поле "Command", но без имени файла самого exe). Поставьте галочку "Use output window", остальные пусть останутся снятыми.
Теперь можно линтить файл в открытой вкладке SSMS: нажмите правой клавишей мыши на заголовке открытой вкладки и выберите пункт меню, название которого выбрали для только что добавленного элемента "External tools".
## Visual Studio External Tool
Настройка команды для линтинга конкретного файла аналогична приведенной выше для SSMS, здесь же приводится пример
для поиска стопперов во всём имеющемся диффе с главной веткой в текущем репозитории:
```ini
Command = \TeamTools.Linter.CommandLine.exe
Arguments = --diff --severity warning --with-version
Initial directory = $(SolutionDir)
Use output window = поставьте галочку
```
### SourceTree Custom Action
Откройте пункт меню Tools/Options в SourceTree, выберите вкладку "Custom actions" и добавьте новый элемент в список. Далее введите полный путь к исполняемому файлу линтера в поле "Script to run" и приведенную ниже строку в поле "Parameter":
`--file "$REPO\$FILE" --severity warning --verbose`
Теперь можно линтить выбранный файл прямо из интерфейса **SourceTree**.
### GIT hook
Измененные файлы можно автоматически линтить перед пушем или даже перед коммитом. Для этого добавьте в соответствующее событие вызов скрипта, пример которого приведен ниже.
В качестве первого и единственного параметра передайте ему полный путь к папке, в которой находится `TeamTools.Linter.CommandLine.exe`
Чтобы результат был похожим на линтинг в пайплайне CI, можно ограничить минимальную серьезность замечаний при помощи параметра `--severity`.
```sh
#!/bin/bash
linter_folder="$1"
echo "linter: $linter_folder"
repo_path="$(git rev-parse --show-toplevel)"
echo "repository: $repo_path"
"$linter_folder/TeamTools.Linter.CommandLine.exe" \
--config "$linter_folder/DefaultConfig.json" \
--dir "$repo_path" \
--basepath "$repo_path" \
--output console \
--severity warning \
--diff \
--withversion
last_exit_code=$?
if [ $last_exit_code -ne 0 ]; then
echo "======="
echo "Linting failed. See errors and warnings above."
echo "All the stoppers must be fixed before pushing branch to server."
echo "======="
exit $last_exit_code
fi
```
### CI pipeline
В пайплайн сборки утилита интегрируется схожим образом: сконструируйте консольный вызов с нужными параметрами и добавьте этот вызов в качестве шага пайплайна. Если не нужно, чтобы обнаружение замечаний роняло билд (например вы отдаете принятие решения на откуп Quality Gate в SonarQube), то добавьте параметр `--quiet` и тогда ExitCode всегда будет 0.