Preskoči na vsebino

Greph

Čisto PHP iskanje kode, strukturno iskanje in mehanizem za prepisovanje. Poteki dela z grep, ripgrep in ast-grep v enem paketu Composer.

Terminal
composer require greph/greph

Najnovejša izdaja v0.2.3 MIT PHP 8.2+

V praksi

Namestite paket z ukazom Composer, nato iščite in prepisujte v ukazni vrstici ali iz PHP.

Iskanje, ujemanje in predogled prepisa

-F izvede iskanje besedila s fiksnim nizom, -p sprejme vzorec v obliki PHP z metavariablami, kot je $CLASS, -r pa doda predlogo za zamenjavo. --dry-run izpiše prepisane datoteke, ne da bi jih zapisalo.

Statična fasada Greph omogoča uporabo istih operacij v kodi PHP. Če so ukazi vendor/bin nameščeni kot odvisnost, potrebujejo različico 0.2.3 ali novejšo.

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

Čisto PHP

Iskanje in prepisovanje se izvajata v PHP 8.2+ brez binarnih datotek grep, ripgrep ali ast-grep. Uporablja razširitve json, ctype in tokenizer ter zlib za predpomnjeno shrambo AST.

Iskanje besedila

Iskanje s fiksnimi nizi in regularnimi izrazi z načini za cele besede, neobčutljivost na velikost črk, kontekst, štetje in samo datoteke. Izhod je združljiv z grep.

Iskanje AST

Strukturno iskanje po izvorni kodi PHP z uporabo $VAR in metavariabel $$$VARIADIC, ponavljajočimi se zajemi in izhodom JSON. Podprt je samo jezik PHP.

Preoblikovanje AST

Strukturno prepisovanje z načini suhega zagona, interaktivnega dela in zapisovanja. Spremeni se samo ujemajoča se koda; komentarji in razporeditev zunaj ujemanja ostanejo nespremenjeni.

Indeksirani načini

Enkrat ustvarite besedilni indeks trigramov, indeks dejstev AST ali predpomnjeno shrambo AST in jih znova uporabite. V primerjalnem preizkusu projekta je ustvarjanje indeksa dejstev AST trajalo 1.4 s in skrajšalo new $CLASS() z 2.9 s na 11 ms; ustvarjanje trigramnega indeksa je trajalo 12.3 s.

Ovojni skripti za rg in sg

vendor/bin/rg in vendor/bin/sg sprejemata običajne zastavice za iskanje ripgrep in ast-grep v istem mehanizmu. Ni podprto: večvrstično iskanje, --replace, --type-add in --sort v rg; pravila YAML in jeziki, ki niso PHP, v sg.

PHP API

Greph::searchText(), searchAst() in rewriteAst() vračajo tipizirane objekte rezultatov, zato lahko koda PHP in agenti pokličejo mehanizem brez podprocesa.

Referenčni korpus Oracle

39 scenarijev primerja izhod besedilnega iskanja, AST in prepisovanja v greph z grep, ripgrep in ast-grep. Zaženite jih z ukazom composer test:oracle v klonu repozitorija; CI izvaja zbirki enotskih in integracijskih preizkusov.

Zakaj Greph

Brez izvornih binarnih datotek

Iskanje in prepisovanje potekata v procesu PHP. Binarne datoteke rg, grep in sg se uporabljajo samo za neobvezne primerjave v primerjalnih preizkusih.

En mehanizem za vse načine

Besedilno iskanje, PHP strukturno iskanje in prepisovanje so združeni v enem paketu Composer. Ovoji rg in sg uporabljajo isti mehanizem kot vendor/bin/greph.

Prepisovanje posega samo v ujemanja

Mehanizem za prepisovanje vstavi izrisano predlogo v obsege bajtov, ki se ujemajo. Koda zunaj ujemanja ohrani zamike, komentarje in prazne vrstice.

Ogreti indeksi brez demona

Indeksi so shranjeni na disku in se znova uporabijo pri naslednjih zagonih. Profil življenjskega cikla določa, ali zastareli indeks ostane nespremenjen, se med iskanjem osveži ali zavrne.

V primerjavi z

Greph ohranja iskanje in prepisovanje znotraj PHP. Ta orodja rešujejo sorodne težave in zmorejo tudi stvari, ki jih Greph ne.

Greph v primerjavi z drugimi orodji
ripgrep Primerno zaOrodje za rekurzivno iskanje z regularnimi izrazi in prvovrstno podporo za Windows, macOS in Linux ter binarnimi prenosi za vsako izdajo. Upošteva pravila gitignore ter privzeto preskoči skrite in binarne datoteke. Razlika v primerjavi z GrephGreph namestite z Composer, izvaja pa se v PHP. V njegovem primerjalnem preizkusu CI na korpusu WordPress je bil rg hitrejši pri vsaki hladni besedilni poizvedbi, na primer 81.62 ms v primerjavi z 458.82 ms pri iskanju dobesednega niza. Ogreti indeks Greph je poizvedbo za štetje obdelal v 10.90 ms v primerjavi z 49.61 ms za rg.
ast-grep Primerno zaPreveden CLI za strukturno iskanje, lint in prepisovanje, zgrajen na tree-sitter. Vgrajeno podpira številne jezike, med njimi PHP, ter uporablja datoteke pravil YAML za pravila lint in spremembe kode. Razlika v primerjavi z GrephGreph obravnava samo PHP in ne bere pravil YAML. Pri hladnem pregledovanju je bil sg v primerjalnem preizkusu CI orodja Greph hitrejši za array($$$ITEMS). Ogreti indeks AST orodja Greph je poizvedbo new $CLASS() obdelal v 10.89 ms v primerjavi z 4093.61 ms za sg.
Rector Primerno zaNadgrajuje in refaktorira kodo PHP s pravili in nabori pravil, ki pokrivajo različice PHP od 5.3 do 8.5 ter projekte, kot so Symfony, PHPUnit in Doctrine. Razlika v primerjavi z GrephGreph prepisuje kodo na podlagi vzorca in predloge, ki jo napišete. Njegova dokumentacija ga odsvetuje, kadar je sprememba odvisna od informacij o tipih, ki jih PHP-Parser ne more razbrati iz ene same datoteke, ali zahteva dodajanje oziroma odstranjevanje uvozov v več datotekah.
PHP CS Fixer Primerno zaPopravlja kodo, da ustreza standardom kodiranja, z vgrajenimi nabori pravil, kot je slog kodiranja PER orodja PHP-FIG. Razlika v primerjavi z GrephGreph ne preoblikuje datotek. Spremeni samo kodo, ki se ujema z vzorcem; dokumentacija priporoča PHP CS Fixer, kadar želite oblikovalnik.

Vprašanja in odgovori

Kratki odgovori iz dokumentacije za Greph.

Preberite dokumentacijo Greph za referenco CLI, PHP API, indeksirane načine ter ovoja rg in sg.