Перейти до вмісту

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 і агенти викликають рушій без підпроцесу.

Корпус 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, щоб ознайомитися з довідником CLI, PHP API, індексованими режимами та обгортками rg і sg.