Greph
Čisté vyhľadávanie kódu v PHP, štrukturálne vyhľadávanie a engine na prepisovanie. Pracovné postupy grep, ripgrep a ast-grep v jedinom balíku Composer.
composer require greph/grephNajnovšie vydanie 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
Nainštalujte balík pomocou Composer a potom vyhľadávajte a prepisujte z príkazového riadka alebo z PHP.
Vyhľadávanie, párovanie a náhľad prepisu
-F vykonáva textové vyhľadávanie pomocou pevného reťazca, -p prijíma vzor v tvare PHP s metapremennými, ako je $CLASS, a -r pridáva šablónu náhrady. --dry-run vypíše prepísané súbory bez ich zápisu.
Statická fasáda Greph poskytuje rovnaké operácie aj kódu PHP. Po nainštalovaní ako závislosť vyžadujú príkazy vendor/bin verziu 0.2.3 alebo novšiu.
# 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
Vyhľadávanie a prepisovanie prebieha v PHP 8.2+ bez binárnych súborov grep, ripgrep či ast-grep. Používa rozšírenia json, ctype a tokenizer, ako aj zlib pre cachované úložisko AST.
Textové vyhľadávanie
Vyhľadávanie pevných reťazcov a regulárnych výrazov s režimami pre celé slová, ignorovanie veľkosti písmen, kontext, počty a iba súbory. Výstup kompatibilný s grep.
Vyhľadávanie v AST
Štrukturálne vyhľadávanie v zdrojovom kóde PHP pomocou $VAR a metapremenných $$$VARIADIC, opakovaných zachytení a výstupu JSON. Podporovaným jazykom je iba PHP.
Prepis AST
Štrukturálne prepisovanie s režimami skúšobného spustenia, interaktívneho použitia a zápisu. Mení sa iba nájdený kód; komentáre a rozloženie mimo zhody zostávajú nezmenené.
Režimy s indexovaním
Index textových trigramov, faktov AST alebo cachované úložisko AST vytvoríte raz a potom ich opakovane používate. V projektovom benchmarku trvalo vytvorenie indexu faktov AST 1,4 s a skrátilo čas new $CLASS() z 2,9 s na 11 ms; index trigramov sa vytváral 12,3 s.
Obaly rg a sg
vendor/bin/rg a vendor/bin/sg používajú na rovnakom engine bežné príznaky vyhľadávania ripgrep a ast-grep. Nepodporované: viacriadkové vyhľadávanie, --replace, --type-add a --sort v rg; pravidlá YAML a jazyky iné než PHP v sg.
PHP API
Greph::searchText(), searchAst() a rewriteAst() vracajú typované objekty výsledkov, takže kód PHP a agenti môžu volať engine bez podprocesu.
Korpus Oracle
39 scenárov porovnáva rozdiely vo výstupe greph pre text, AST a prepisovanie s grep, ripgrep a ast-grep. Spustite ich príkazom composer test:oracle v klone repozitára; CI spúšťa jednotkové a integračné testovacie sady.
Prečo Greph
Bez natívnych binárnych súborov
Vyhľadávanie a prepisovanie prebieha v procese PHP. Binárne súbory rg, grep a sg sa používajú iba na voliteľné porovnanie benchmarkov.
Jeden engine pre každý režim
Textové vyhľadávanie, štrukturálne vyhľadávanie PHP a prepisovanie sú súčasťou jedného balíka Composer. Obaly rg a sg volajú rovnaký engine ako vendor/bin/greph.
Prepisovanie mení iba zhody
Nástroj na prepisovanie vloží vykreslenú šablónu do rozsahov bajtov, ktoré zodpovedajú zhode. Kód mimo zhody si zachová odsadenie, komentáre aj prázdne riadky.
Zahriate indexy bez démona
Indexy sú uložené na disku a opakovane sa používajú pri ďalších spusteniach. Profil životného cyklu určuje, či sa zastaraný index ponechá bez zmeny, obnoví počas vyhľadávania alebo odmietne.
V porovnaní s
Greph spája vyhľadávanie a prepisovanie v PHP. Tieto nástroje riešia súvisiace problémy a niektoré úlohy, ktoré Greph nezvláda.
| Nástroj | V čom vyniká | Rozdiel oproti Greph |
|---|---|---|
| ripgrep | V čom vynikáNástroj na rekurzívne vyhľadávanie regulárnych výrazov s prvotriednou podporou pre Windows, macOS a Linux a binárnymi súbormi na stiahnutie pre každé vydanie. Rešpektuje pravidlá gitignore a predvolene preskakuje skryté a binárne súbory. | Rozdiel oproti GrephGreph sa inštaluje pomocou Composer a beží v PHP. V benchmarku CI na korpuse WordPress bolo rg rýchlejšie pri každom studenom textovom vyhľadávaní, napríklad 81,62 ms oproti 458.82 ms pri doslovnom vyhľadávaní. Zahriaty index Greph odpovedal na dopyt na počet za 10,90 ms oproti 49,61 ms pri rg. |
| ast-grep | V čom vynikáKompilovaný CLI na štrukturálne vyhľadávanie, lintovanie a prepisovanie, postavený na tree-sitter. Má vstavanú podporu mnohých jazykov vrátane PHP a súbory pravidiel YAML na lintovacie pravidlá a zmeny kódu. | Rozdiel oproti GrephGreph spracúva iba PHP a nečíta žiadne pravidlá YAML. Pri studenom prehľadávaní bolo sg v benchmarku CI nástroja Greph rýchlejšie pri array($$$ITEMS). Zahriaty index AST nástroja Greph odpovedal na dopyt new $CLASS() za 10,89 ms oproti 4093.61 ms pri sg. |
| Rector | V čom vynikáAktualizuje a refaktoruje kód PHP pomocou pravidiel a ich súborov; pokrýva verzie PHP od 5.3 do 8.5 a projekty ako Symfony, PHPUnit a Doctrine. | Rozdiel oproti GrephGreph prepisuje kód podľa vzoru a šablóny, ktoré napíšete. Dokumentácia ho neodporúča pri zmenách závislých od informácií o typoch, ktoré PHP-Parser nedokáže určiť z jediného súboru, ani pri potrebe pridávať či odstraňovať importy naprieč súbormi. |
| PHP CS Fixer | V čom vynikáUpravuje kód tak, aby dodržiaval štandardy kódovania, pomocou vstavaných súborov pravidiel, ako je PER Coding Style od PHP-FIG. | Rozdiel oproti GrephGreph neformátuje súbory. Mení iba kód zodpovedajúci vzoru a v dokumentácii odkazuje na PHP CS Fixer, ak potrebujete formátovač. |
Otázky a odpovede
Stručné odpovede z dokumentácie Greph.
Nie. Greph vykonáva vyhľadávanie a prepisovanie v PHP. Externé binárne súbory rg, grep a sg sa používajú iba na voliteľné porovnanie benchmarkov.
Iba PHP. Vzory a zdrojové súbory sa parsujú pomocou nikic/php-parser a každá iná hodnota --lang sa odmietne ako nepodporovaná.
Pri studenom prehľadávaní nie. V benchmarku CI projektu na korpuse WordPress boli rg a grep rýchlejšie pri každom studenom textovom vyhľadávaní. Zahriate indexy pomáhajú pri opakovaných dopytoch, napríklad indexovaný dopyt na počet trval 10,90 ms oproti 49,61 ms pri rg.
Greph beží v jednom procese. Bez pcntl_fork spracuje skupina pracovných procesov každý blok v rámci procesu, s rovnakým výsledkom ako pri -j 1, a nevyvolá chybu.
Mimo zhody nie. Kód mimo zodpovedajúcich rozsahov bajtov si zachová medzery, komentáre aj rozloženie. Zodpovedajúci kód sa znova vytlačí zo šablóny, takže jeho zalomenia riadkov sa zjednotia a komentár vnútri sa môže stratiť. Najprv spustite príkaz s --dry-run, aby sa prepísané súbory vypísali bez zápisu.
Predvolene v adresároch .greph-index, .greph-ast-index a .greph-ast-cache v indexovanom koreňovom adresári. Ak chcete použiť iné umiestnenie, zadajte --index-dir pri ľubovoľnom podpríkaze greph-index.
V dokumentácii Greph nájdete referenčné informácie pre CLI, PHP API, indexované režimy a obaly rg a sg.