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.
composer require greph/grephNejnovější vydání 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)' srcV 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ší.
# 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(),
);Č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í.
| Nástroj | Vhodné pro | Rozdíl oproti Greph |
|---|---|---|
| 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č. |
Zdroje, zaškrtnuto
Otázky a odpovědi
Stručné odpovědi z dokumentace Greph.
Ne. Greph provádí vyhledávání a přepisování v PHP. Externí binární soubory rg, grep a sg se používají pouze pro volitelné porovnání výkonu.
Pouze PHP. Vzory a zdrojové soubory se parsují pomocí nikic/php-parser a každá jiná hodnota --lang je odmítnuta jako nepodporovaná.
Při studeném prohledávání ne. V CI benchmarku projektu nad korpusem WordPress byly rg a grep rychlejší při každém studeném textovém dotazu. Zahřáté indexy pomáhají při opakovaných dotazech; například indexovaný dotaz na počet trval 10.90 ms oproti 49.61 ms u rg.
Greph běží v jediném procesu. Bez pcntl_fork fond pracovníků zpracuje každý blok v procesu, se stejným výsledkem jako při -j 1, a nevyvolá chybu.
Mimo nalezenou shodu ne. Kód mimo rozsahy bajtů odpovídající shodě si zachová mezery, komentáře a rozvržení. Kód ve shodě se znovu vypíše podle šablony, takže se sjednotí konce řádků a komentář uvnitř může být ztracen. Nejprve spusťte příkaz s --dry-run, který vypíše přepsané soubory, aniž by je zapsal na disk.
Ve výchozím nastavení v adresářích .greph-index, .greph-ast-index a .greph-ast-cache v kořenovém adresáři indexovaného projektu. Chcete-li použít jiné umístění, předejte příznak --index-dir libovolnému podřízenému příkazu greph-index.
V dokumentaci Greph najdete reference pro CLI, PHP API, indexované režimy a obalovací vrstvy rg a sg.