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 і агенти викликають рушій без підпроцесу.
Корпус Oracle
39 сценаріїв порівнюють текстовий diff, AST і результат переписування greph із 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 Coding Style від PHP-FIG. | Відмінність від GrephGreph не переформатовує файли. Він змінює лише код, якому відповідає шаблон, а в документації радять скористатися PHP CS Fixer для форматування. |
Джерела, позначено
Запитання та відповіді
Короткі відповіді з документації Greph.
Ні. Greph виконує пошук і переписування в PHP. Зовнішні двійкові файли rg, grep і sg використовуються лише для необов’язкових порівнянь у бенчмарках.
Лише PHP. Шаблони й вихідні файли розбираються за допомогою nikic/php-parser, а будь-яке інше значення --lang відхиляється як непідтримуване.
На холодному скануванні — ні. У CI-бенчмарку проєкту на корпусі WordPress rg і grep швидше виконували кожен холодний текстовий запит. Теплі індекси пришвидшують повторні запити: наприклад, індексований підрахунок у rg тривав 10.90 ms проти 49.61 ms.
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.