Greph
Čisto PHP iskanje kode, strukturno iskanje in mehanizem za prepisovanje. Poteki dela z grep, ripgrep in ast-grep v enem paketu Composer.
composer require greph/grephNajnovejša izdaja 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 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.
# 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(),
);Č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.
| Orodje | Primerno za | Razlika v primerjavi z Greph |
|---|---|---|
| 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.
Ne. Greph izvaja iskanje in prepisovanje v PHP. Zunanje binarne datoteke rg, grep in sg se uporabljajo samo za neobvezne primerjave v primerjalnih preizkusih.
Samo PHP. Vzorci in izvorne datoteke se razčlenijo z nikic/php-parser, vsaka druga vrednost --lang pa je zavrnjena kot nepodprta.
Pri hladnem pregledovanju ne. V primerjalnem preizkusu CI projekta na korpusu WordPress sta bila rg in grep hitrejša pri vseh hladnih besedilnih poizvedbah. Ogreti indeksi pomagajo pri ponavljajočih se poizvedbah; na primer, indeksirano štetje je trajalo 10.90 ms v primerjavi z 49.61 ms za rg.
Greph se izvaja v enem procesu. Brez pcntl_fork skupina delavcev obdela vsak kos znotraj procesa, z enakim rezultatom kot pri -j 1, in ne sproži napake.
Zunaj ujemanja ne. Koda zunaj obsegov ujemajočih se bajtov ohrani presledke, komentarje in razporeditev. Ujemajoča se koda se znova izpiše iz predloge, zato se prelomi vrstic poenotijo, komentar znotraj nje pa se lahko izgubi. Najprej zaženite z --dry-run, da se prepisane datoteke izpišejo brez zapisovanja.
Privzeto v .greph-index, .greph-ast-index in .greph-ast-cache v korenu indeksiranega drevesa. Za drugo mesto podajte --index-dir kateremu koli podukazu greph-index.
Preberite dokumentacijo Greph za referenco CLI, PHP API, indeksirane načine ter ovoja rg in sg.