Przejdź do treści

Greph

Czysty PHP: wyszukiwanie kodu, wyszukiwanie strukturalne i silnik przepisywania. Przepływy pracy grep, ripgrep i ast-grep w jednym pakiecie Composer.

Terminal
composer require greph/greph

Najnowsze wydanie v0.2.3 MIT PHP 8.2+

W praktyce

Zainstaluj pakiet za pomocą Composer, a następnie wyszukuj i przepisuj kod z wiersza poleceń lub z poziomu PHP.

Wyszukiwanie, dopasowywanie i podgląd przepisywania

-F wykonuje wyszukiwanie tekstu według stałego ciągu, -p przyjmuje wzorzec w stylu PHP ze zmiennymi metawzorców, takimi jak $CLASS, a -r dodaje szablon zamiany. --dry-run wyświetla przepisane pliki bez ich zapisywania.

Statyczna fasada Greph udostępnia te same operacje kodowi PHP. Po zainstalowaniu jako zależność polecenia vendor/bin wymagają wersji 0.2.3 lub nowszej.

Terminal
# 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

Czysty PHP

Wyszukiwanie i przepisywanie działają w PHP 8.2+ bez plików binarnych grep, ripgrep ani ast-grep. Wykorzystują rozszerzenia json, ctype i tokenizer oraz zlib do przechowywania pamięci podręcznej AST.

Wyszukiwanie tekstu

Wyszukiwanie według stałego ciągu lub wyrażenia regularnego z trybami całych słów, bez rozróżniania wielkości liter, kontekstu, zliczania i tylko dla plików. Wyniki zgodne z grep.

Wyszukiwanie AST

Wyszukiwanie strukturalne kodu źródłowego PHP z użyciem $VAR i zmiennych metawzorców $$$VARIADIC, powtarzanych przechwyceń oraz wyników JSON. Obsługiwanym językiem jest wyłącznie PHP.

Przepisywanie AST

Przepisywanie strukturalne w trybie próbnym, interaktywnym i zapisu. Zmienia się tylko dopasowany kod; komentarze i układ poza dopasowaniem pozostają bez zmian.

Tryby indeksowane

Utwórz raz indeks tekstowy trójgramów, indeks faktów AST lub pamięć podręczną AST i używaj go ponownie. W teście porównawczym projektu indeks faktów AST utworzył się w 1.4 s i skrócił new $CLASS() z 2.9 s do 11 ms; utworzenie indeksu trójgramów zajęło 12.3 s.

Opakowania rg i sg

vendor/bin/rg i vendor/bin/sg przyjmują typowe flagi wyszukiwania ripgrep i ast-grep na tym samym silniku. Nie są obsługiwane: wyszukiwanie wielowierszowe, --replace, --type-add i --sort w rg; reguły YAML i języki inne niż PHP w sg.

PHP API

Greph::searchText(), searchAst() i rewriteAst() zwracają typowane obiekty wynikowe, dzięki czemu kod PHP i agenci mogą wywoływać silnik bez podprocesu.

Korpus porównawczy Oracle

39 scenariuszy porównuje różnice w wynikach wyszukiwania tekstowego, AST i przepisywania greph z grep, ripgrep i ast-grep. Uruchom je poleceniem composer test:oracle w klonie repozytorium; CI uruchamia zestawy testów jednostkowych i integracyjnych.

Dlaczego Greph

Bez natywnych plików binarnych

Wyszukiwanie i przepisywanie działają w procesie PHP. Pliki binarne rg, grep i sg są używane wyłącznie w opcjonalnych testach porównawczych.

Jeden silnik do każdego trybu

Wyszukiwanie tekstu, wyszukiwanie strukturalne PHP i przepisywanie działają w jednym pakiecie Composer. Opakowania rg i sg wywołują ten sam silnik co vendor/bin/greph.

Przepisywanie dotyczy tylko dopasowań

Mechanizm przepisywania wstawia wygenerowany szablon w zakresy bajtów objęte dopasowaniem. Kod poza dopasowaniem zachowuje wcięcia, komentarze i puste wiersze.

Rozgrzane indeksy bez usługi działającej w tle

Indeksy są przechowywane na dysku i używane ponownie przy kolejnych uruchomieniach. Profil cyklu życia określa, czy nieaktualny indeks pozostaje bez zmian, jest odświeżany podczas wyszukiwania czy odrzucany.

W porównaniu z

Greph łączy wyszukiwanie i przepisywanie w PHP. Te narzędzia rozwiązują podobne problemy, a niektórych zadań Greph nie potrafi wykonać.

Greph w porównaniu z innymi narzędziami
ripgrep Dobre wRekurencyjne narzędzie do wyszukiwania wyrażeń regularnych z natywną obsługą na platformach Windows, macOS i Linux oraz plikami binarnymi do pobrania dla każdego wydania. Domyślnie respektuje reguły gitignore i pomija ukryte pliki oraz pliki binarne. Różnica w porównaniu z GrephGreph instaluje się za pomocą Composer i działa w PHP. W teście porównawczym CI na korpusie WordPress rg było szybsze przy każdym wyszukiwaniu zimnego tekstu, na przykład 81.62 ms wobec 458.82 ms przy wyszukiwaniu dosłownym. Rozgrzany indeks Greph odpowiedział na zapytanie zliczające w 10.90 ms wobec 49.61 ms w rg.
ast-grep Dobre wSkompilowane CLI do wyszukiwania strukturalnego, lintowania i przepisywania, zbudowane na tree-sitter. Ma wbudowaną obsługę wielu języków, w tym PHP, oraz pliki reguł YAML do lintowania i zmian w kodzie. Różnica w porównaniu z GrephGreph obsługuje wyłącznie PHP i nie odczytuje reguł YAML. W teście porównawczym CI Greph podczas zimnego skanowania sg było szybsze dla array($$$ITEMS). Rozgrzany indeks AST Greph odpowiedział na new $CLASS() w 10.89 ms wobec 4093.61 ms w sg.
Rector Dobre wAktualizuje i refaktoryzuje kod PHP za pomocą reguł i zestawów reguł, obejmujących wersje PHP od 5.3 do 8.5 oraz projekty takie jak Symfony, PHPUnit i Doctrine. Różnica w porównaniu z GrephGreph przepisuje kod na podstawie wzorca i napisanego przez Ciebie szablonu. Dokumentacja odradza użycie go, gdy zmiana zależy od informacji o typach, których PHP-Parser nie potrafi ustalić na podstawie pojedynczego pliku, lub wymaga dodania albo usunięcia importów w wielu plikach.
PHP CS Fixer Dobre wPoprawia kod, aby spełniał standardy kodowania, korzystając z wbudowanych zestawów reguł, takich jak PER Coding Style w PHP-FIG. Różnica w porównaniu z GrephGreph nie formatuje plików. Zmienia tylko kod dopasowany przez wzorzec, a dokumentacja poleca PHP CS Fixer, jeśli potrzebujesz narzędzia formatującego.

Pytania i odpowiedzi

Krótkie odpowiedzi z dokumentacji Greph.

Przeczytaj dokumentację Greph dotyczącą CLI, PHP API, trybów indeksowanych oraz opakowań rg i sg.