Greph
Czysty PHP: wyszukiwanie kodu, wyszukiwanie strukturalne i silnik przepisywania. Przepływy pracy grep, ripgrep i ast-grep w jednym pakiecie Composer.
composer require greph/grephNajnowsze wydanie 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)' srcW 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.
# 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(),
);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ć.
| Narzędzie | Dobre w | Różnica w porównaniu z Greph |
|---|---|---|
| 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. |
Źródła, zaznaczone
Pytania i odpowiedzi
Krótkie odpowiedzi z dokumentacji Greph.
Nie. Greph wykonuje wyszukiwanie i przepisywanie w PHP. Zewnętrzne pliki binarne rg, grep i sg są używane wyłącznie w opcjonalnych testach porównawczych.
Wyłącznie PHP. Wzorce i pliki źródłowe są analizowane za pomocą nikic/php-parser, a każda inna wartość --lang jest odrzucana jako nieobsługiwana.
Nie podczas zimnego skanowania. W teście porównawczym CI projektu na korpusie WordPress rg i grep były szybsze przy każdym wyszukiwaniu zimnego tekstu. Rozgrzane indeksy przyspieszają powtarzane zapytania, na przykład indeksowane zliczanie zajęło 10.90 ms wobec 49.61 ms w rg.
Greph działa w jednym procesie. Bez pcntl_fork pula procesów roboczych przetwarza każdą porcję w bieżącym procesie, dając ten sam wynik co -j 1 i nie zgłaszając błędu.
Poza dopasowaniem — nie. Kod poza zakresami bajtów objętymi dopasowaniem zachowuje białe znaki, komentarze i układ. Dopasowany kod jest ponownie drukowany z szablonu, więc podziały wierszy są normalizowane, a komentarz w jego obrębie może zostać utracony. Najpierw uruchom z --dry-run, aby wyświetlić przepisane pliki bez ich zapisywania.
Domyślnie w katalogach .greph-index, .greph-ast-index i .greph-ast-cache w katalogu głównym indeksowanego projektu. Przekaż --index-dir dowolnemu podpoleceniu greph-index, aby użyć innej lokalizacji.
Przeczytaj dokumentację Greph dotyczącą CLI, PHP API, trybów indeksowanych oraz opakowań rg i sg.