Přejít k obsahu

Greph

Čisté vyhledávání kódu PHP, strukturální vyhledávání a engine pro přepisování. Pracovní postupy s grep, ripgrep a ast-grep v jediném balíčku Composer.

Terminál
composer require greph/greph

Nejnovější vydání v0.2.3 MIT PHP 8.2+

V praxi

Nainstalujte balíček pomocí Composer a poté vyhledávejte a přepisujte z příkazového řádku nebo z PHP.

Vyhledejte, najděte shodu a zobrazte náhled přepisu

-F provádí textové vyhledávání pomocí pevných řetězců, -p přijímá vzor ve tvaru PHP s metavariabilami, jako je $CLASS, a -r přidává šablonu náhrady. --dry-run vypíše přepsané soubory, aniž by je zapsal na disk.

Statické rozhraní Greph zpřístupňuje stejné operace v kódu PHP. Po instalaci jako závislosti vyžadují příkazy vendor/bin verzi 0.2.3 nebo novější.

Terminál
# 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

Čisté PHP

Vyhledávání a přepisování běží v PHP 8.2+ bez binárních souborů grep, ripgrep nebo ast-grep. Využívá rozšíření json, ctype a tokenizer a také zlib pro ukládání AST do mezipaměti.

Textové vyhledávání

Vyhledávání pomocí pevných řetězců a regulárních výrazů s režimy pro celá slova, nerozlišování velikosti písmen, kontext, počet shod a pouze soubory. Výstup kompatibilní s grep.

Vyhledávání AST

Strukturální vyhledávání ve zdrojovém kódu PHP s metavariabilami $VAR a $$$VARIADIC, opakovanými zachycenými hodnotami a výstupem JSON. Podporován je pouze jazyk PHP.

Přepis AST

Strukturální přepisy v režimech zkušebního běhu, interaktivním režimu a režimu zápisu. Mění se pouze odpovídající kód; komentáře a rozvržení mimo shodu zůstávají beze změny.

Indexované režimy

Vytvořte index trigramů, index faktů AST nebo mezipaměť AST a znovu je používejte. V benchmarku projektu se index faktů AST vytvořil za 1.4 s a zkrátil dobu new $CLASS() z 2.9 s na 11 ms; vytvoření indexu trigramů trvalo 12.3 s.

Obalovací vrstvy rg a sg

vendor/bin/rg a vendor/bin/sg přijímají běžné příznaky vyhledávání ripgrep a ast-grep nad stejným enginem. Nepodporováno: víceřádkové vyhledávání, --replace, --type-add a --sort v rg; pravidla YAML a jazyky jiné než PHP v sg.

PHP API

Greph::searchText(), searchAst() a rewriteAst() vracejí typované objekty výsledků, takže PHP kód a agenti mohou volat engine bez podprocesu.

Referenční korpus

39 scénářů porovnává výstup greph pro text, AST a přepisování s nástroji grep, ripgrep a ast-grep. Spusťte je příkazem composer test:oracle v klonu repozitáře; CI spouští sady jednotkových a integračních testů.

Proč Greph

Bez nativních binárních souborů

Vyhledávání a přepisování probíhá v procesu PHP. Binární soubory rg, grep a sg se používají pouze pro volitelné porovnání výkonu.

Jeden engine pro všechny režimy

Textové vyhledávání, strukturální vyhledávání PHP a přepisování jsou součástí jednoho balíčku Composer. Obalovací vrstvy rg a sg používají stejný engine jako vendor/bin/greph.

Přepisuje se pouze nalezená shoda

Přepisovací nástroj vloží vykreslenou šablonu do rozsahů bajtů odpovídajících shodě. Kód mimo shodu si zachová odsazení, komentáře a prázdné řádky.

Zahřáté indexy bez démona

Indexy jsou uložené na disku a znovu se používají při dalších spuštěních. Profil životního cyklu určuje, zda se zastaralý index ponechá beze změny, obnoví během vyhledávání, nebo jeho použití odmítne.

Srovnání

Greph zajišťuje vyhledávání a přepisování v PHP. Tyto nástroje řeší podobné problémy a některé věci Greph neumí.

Greph ve srovnání s ostatními nástroji
ripgrep Vhodné proNástroj pro rekurzivní vyhledávání regulárními výrazy s nativní podporou Windows, macOS a Linux a binárními soubory ke stažení pro každé vydání. Respektuje pravidla gitignore a ve výchozím nastavení přeskakuje skryté a binární soubory. Rozdíl oproti GrephGreph se instaluje pomocí Composer a běží v PHP. V CI benchmarku na korpusu WordPress byl rg při každém studeném textovém dotazu rychlejší, například 81.62 ms oproti 458.82 ms při doslovném vyhledávání. Zahřátý index Greph odpověděl na dotaz na počet za 10.90 ms oproti 49.61 ms u rg.
ast-grep Vhodné proZkompilovaný nástroj CLI pro strukturální vyhledávání, lintování a přepisování, postavený na tree-sitter. Obsahuje vestavěnou podporu mnoha jazyků, mezi nimi PHP, a soubory pravidel YAML pro lintování a změny kódu. Rozdíl oproti GrephGreph podporuje pouze PHP a nenačítá žádná pravidla YAML. Při studeném prohledávání byl sg v CI benchmarku Greph rychlejší pro array($$$ITEMS). Zahřátý index AST nástroje Greph zodpověděl dotaz new $CLASS() za 10.89 ms oproti 4093.61 ms u sg.
Rector Vhodné proAktualizuje a refaktoruje kód PHP pomocí pravidel a jejich sad; pokrývá verze PHP od 5.3 do 8.5 a projekty jako Symfony, PHPUnit a Doctrine. Rozdíl oproti GrephGreph přepisuje kód podle vzoru a šablony, kterou napíšete. Dokumentace jej nedoporučuje, pokud změna závisí na informacích o typech, které PHP-Parser nedokáže zjistit z jediného souboru, nebo pokud je třeba přidávat či odebírat importy napříč soubory.
PHP CS Fixer Vhodné proUpravuje kód tak, aby odpovídal standardům stylu kódování; obsahuje sady pravidel jako PER Coding Style od PHP-FIG. Rozdíl oproti GrephGreph nepřeformátovává soubory. Mění pouze kód odpovídající vzoru a v dokumentaci doporučuje PHP CS Fixer, pokud potřebujete formátovač.

Otázky a odpovědi

Stručné odpovědi z dokumentace Greph.

V dokumentaci Greph najdete reference pro CLI, PHP API, indexované režimy a obalovací vrstvy rg a sg.