Greph
Чисто PHP търсене в код, структурно търсене и енджин за пренаписване. Работни процеси с grep, ripgrep и ast-grep в един пакет Composer.
composer require greph/grephПоследна версия v0.2.3 MIT PHP 8.2+
# Any method call with any arguments
vendor/bin/greph -p '$obj->$method($$$ARGS)' src
# Any function declaration with a void return type
vendor/bin/greph -p 'function $name($$$PARAMS): void {}' src
# Old-style array calls
vendor/bin/greph -p 'array($$$ITEMS)' srcНа практика
Инсталирайте пакета с 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 srcuse Greph\Greph;
use Greph\Ast\AstSearchOptions;
use Greph\Text\TextSearchOptions;
$matches = Greph::searchText(
'function',
'src',
new TextSearchOptions(fixedString: true),
);
$asts = Greph::searchAst(
'new $CLASS()',
'src',
new AstSearchOptions(),
);Чисто 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 изпълнява търсенето и пренаписването в PHP. Външните двоични файлове rg, grep и sg се използват само за незадължителни сравнения в бенчмарка.
Само PHP. Шаблоните и изходните файлове се анализират с nikic/php-parser, а всяка друга стойност на --lang се отхвърля като неподдържана.
Не при студени сканирания. В CI бенчмарка на проекта върху корпуса WordPress rg и grep бяха по-бързи при всяка заявка за студено текстово търсене. Топлите индекси ускоряват повтарящите се заявки, например 10.90 ms спрямо 49.61 ms за rg при индексирана заявка за брой резултати.
Greph се изпълнява в един процес. Без pcntl_fork пулът от работни процеси изпълнява всеки блок в текущия процес, със същия резултат като при -j 1, и не извежда грешка.
Не извън съвпаденията. Кодът извън съвпадналите диапазони от байтове запазва интервалите, коментарите и оформлението си. Съвпадналият код се отпечатва отново по шаблона, затова новите редове се нормализират и коментар в него може да бъде загубен. Изпълнете първо с --dry-run, за да изведете пренаписаните файлове, без да ги записвате.
По подразбиране в .greph-index, .greph-ast-index и .greph-ast-cache в корена на индексирания проект. Подайте --index-dir на която и да е подкоманда greph-index, за да използвате друго местоположение.
Прочетете документацията на Greph за справочника за CLI, PHP API, индексираните режими и обвивките rg и sg.