Към съдържанието

Greph

Чисто PHP търсене в код, структурно търсене и енджин за пренаписване. Работни процеси с grep, ripgrep и ast-grep в един пакет Composer.

Терминал
composer require greph/greph

Последна версия v0.2.3 MIT PHP 8.2+

На практика

Инсталирайте пакета с Composer, след което търсете и пренаписвайте от командния ред или чрез PHP.

Търсете, намирайте съвпадения и преглеждайте пренаписването

-F изпълнява текстово търсене на точен низ, -p приема шаблон във формат PHP с метапроменливи като $CLASS, а -r добавя шаблон за заместване. --dry-run извежда пренаписаните файлове, без да ги записва.

Статичната фасада Greph предоставя същите операции на кода на PHP. Когато са инсталирани като зависимост, командите vendor/bin изискват версия 0.2.3 или по-нова.

Терминал
# Text search
vendor/bin/greph -F "function" src

# Structural search
vendor/bin/greph -p 'new $CLASS()' src

# Structural rewrite preview
vendor/bin/greph -p 'array($$$ITEMS)' -r '[$$$ITEMS]' --dry-run src

Чисто PHP

Търсенето и пренаписването се изпълняват в PHP 8.2+, без двоични файлове за grep, ripgrep или ast-grep. Използва разширенията json, ctype и tokenizer, както и zlib за кешираното хранилище на AST.

Търсене в текст

Търсене на точни низове и с регулярни изрази, с режими за цяла дума, нечувствителност към регистъра, контекст, брой резултати и само файлове. Изход, съвместим с grep.

AST търсене

Структурно търсене в изходния код на PHP с метапроменливи $VAR и $$$VARIADIC, повтарящи се заснемания и изход JSON. Поддържа се само езикът PHP.

AST пренаписване

Структурни пренаписвания с режими за пробно изпълнение, интерактивно изпълнение и запис. Променя се само съвпадналият код; коментарите и оформлението извън съвпадението остават непроменени.

Индексирани режими

Създайте веднъж текстов индекс на триграми, AST индекс на факти или кеширано хранилище на AST и ги използвайте повторно. В бенчмарка на проекта AST индексът на факти се създаде за 1.4 s и намали new $CLASS() от 2.9 s до 11 ms; индексът на триграми отне 12.3 s.

Обвивки за rg и sg

vendor/bin/rg и vendor/bin/sg приемат често използваните флагове за търсене на ripgrep и ast-grep в един и същ енджин. Не се поддържат: многострочен режим, --replace, --type-add и --sort в rg; правила YAML и езици извън PHP в sg.

PHP API

Greph::searchText(), searchAst() и rewriteAst() връщат типизирани обекти с резултати, така че кодът на PHP и агентите да могат да извикват енджина без подпроцес.

Корпус за сравнение

39 сценария сравняват изхода на greph за текст, AST и пренаписване с този на grep, ripgrep и ast-grep. Стартирайте ги с composer test:oracle в клонирано хранилище; CI изпълнява пакетите с модулни и интеграционни тестове.

Защо Greph

Без вградени двоични файлове

Търсенето и пренаписването се изпълняват в процеса на PHP. Двоичните файлове rg, grep и sg се използват само за незадължителни сравнения в бенчмарка.

Един енджин за всички режими

Търсенето в текст, структурното търсене на PHP и пренаписването са в един пакет Composer. Обвивките rg и sg извикват същия енджин като vendor/bin/greph.

Пренаписването засяга само съвпаденията

Механизмът за пренаписване вмъква изобразения шаблон в съвпадналите диапазони от байтове. Кодът извън съвпадението запазва отстъпите, коментарите и празните редове.

Индекси в паметта без демон

Индексите се съхраняват на диска и се използват повторно при следващи изпълнения. Профилът за жизнения цикъл определя дали остарелият индекс да остане непроменен, да се обнови по време на търсенето или да бъде отхвърлен.

Сравнение с

Greph обединява търсенето и пренаписването в PHP. Тези инструменти решават сходни проблеми, а някои неща Greph не може да прави.

Greph в сравнение с други инструменти
ripgrep Подходящ заИнструмент за рекурсивно търсене с регулярни изрази и вградена поддръжка в Windows, macOS и Linux, с двоични файлове за изтегляне за всяко издание. По подразбиране спазва правилата на gitignore и пропуска скритите и двоичните файлове. Разлики спрямо GrephGreph се инсталира с Composer и се изпълнява в PHP. В CI бенчмарка му върху корпуса WordPress rg беше по-бърз при всяка заявка за студено текстово търсене, например 81.62 ms спрямо 458.82 ms при търсене на точен низ. Топлият индекс Greph отговори на заявка за брой резултати за 10.90 ms спрямо 49.61 ms за rg.
ast-grep Подходящ заКомпилиран CLI за структурно търсене, линтиране и пренаписване, изграден върху tree-sitter. Има вградена поддръжка за много езици, сред които PHP, и файлове с правила YAML за линтиране и промени в кода. Разлики спрямо GrephGreph обработва само PHP и не чете правила YAML. При студено сканиране sg беше по-бърз за array($$$ITEMS) в CI бенчмарка на Greph. Топлият AST индекс на Greph отговори на new $CLASS() за 10.89 ms спрямо 4093.61 ms за sg.
Rector Подходящ заНадгражда и рефакторира код на PHP чрез правила и набори от правила, като поддържа версии PHP от 5.3 до 8.5 и проекти като Symfony, PHPUnit и Doctrine. Разлики спрямо GrephGreph пренаписва код въз основа на шаблон и зададен от вас образец. Документацията му посочва, че не е подходящ, когато промяната зависи от информация за типовете, която PHP-Parser не може да определи само от един файл, или изисква импорти да се добавят или премахват в няколко файла.
PHP CS Fixer Подходящ заКоригира кода според стандартите за кодиране, с вградени набори от правила като PER стила за кодиране на PHP-FIG. Разлики спрямо GrephGreph не преформатира файлове. Променя само кода, съвпаднал с шаблон, а документацията му препоръчва PHP CS Fixer, когато искате форматиращ инструмент.

Източници, отметнато

Въпроси и отговори

Кратки отговори от документацията на Greph.

Прочетете документацията на Greph за справочника за CLI, PHP API, индексираните режими и обвивките rg и sg.