Greph
Ren PHP-kodesøgning, strukturel søgning og omskrivningsmotor. grep-, ripgrep- og ast-grep-arbejdsgange i én Composer-pakke.
composer require greph/grephSeneste udgivelse 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)' srcI praksis
Installer pakken med Composer, og søg og omskriv derefter fra kommandolinjen eller fra PHP.
Søg, match og forhåndsvis en omskrivning
-F udfører en tekstsøgning med fast streng, -p tager et PHP-formet mønster med metavariabler som $CLASS, og -r tilføjer en erstatningsskabelon. --dry-run udskriver de omskrevne filer uden at skrive ændringerne.
Den statiske facade Greph gør de samme handlinger tilgængelige for PHP-kode. Når kommandoerne vendor/bin er installeret som en afhængighed, kræver de version 0.2.3 eller nyere.
# 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(),
);Ren PHP
Søgning og omskrivning kører i PHP 8.2+ uden grep-, ripgrep- eller ast-grep-binærfil. Bruger udvidelserne json, ctype og tokenizer samt zlib til det cachelagrede AST-lager.
Tekstsøgning
Søgning med faste strenge og regex med hele ord, ufølsomhed over for store og små bogstaver samt tilstande til kontekst, antal og kun filnavne. grep-kompatibelt output.
AST-søgning
Strukturel søgning i PHP-kildekode med $VAR- og $$$VARIADIC-metavariabler, gentagne optagelser og JSON-output. PHP er det eneste understøttede sprog.
AST-omskrivning
Strukturelle omskrivninger med prøvekørsel, interaktiv tilstand og skrivetilstand. Kun matchet kode ændres; kommentarer og layout uden for et match forbliver uændrede.
Indekserede tilstande
Byg et trigramtekstindeks, et AST-faktaindeks eller et cachelagret AST-lager én gang, og genbrug det. I projektets benchmark tog det 1,4 s at bygge AST-faktaindekset, som sænkede new $CLASS() fra 2,9 s til 11 ms; trigramindekset tog 12,3 s.
Wrapperne rg og sg
vendor/bin/rg og vendor/bin/sg accepterer de almindelige søgeflag ripgrep og ast-grep på samme motor. Ikke understøttet: flere linjer, --replace, --type-add og --sort i rg; reglerne YAML og sprog, der ikke er PHP, i sg.
PHP API
Greph::searchText(), searchAst() og rewriteAst() returnerer typede resultatobjekter, så kode i PHP og agenter kan kalde motoren uden en underproces.
Oracle-korpus
39 scenarier sammenligner tekst-, AST- og omskrivningsoutput fra greph med grep, ripgrep og ast-grep. Kør dem med composer test:oracle i en klon af repository'et; CI kører enheds- og integrationspakkerne.
Hvorfor Greph
Ingen native binærfiler
Søgning og omskrivning kører i PHP-processen. Binærfilerne rg, grep og sg bruges kun til de valgfrie benchmark-sammenligninger.
Én motor til alle tilstande
Tekstsøgning, PHP strukturel søgning og omskrivning findes i én Composer-pakke. Wrapperne rg og sg kalder den samme motor som vendor/bin/greph.
Omskrivninger berører kun match
Omskrivningsværktøjet indsætter den gengivne skabelon i de matchede byteområder. Kode uden for et match bevarer indrykning, kommentarer og tomme linjer.
Indeks genbruges uden en dæmon
Indeks ligger på disken og genbruges på tværs af kørsler. En livscyklusprofil afgør, om et forældet indeks efterlades uændret, opdateres under søgningen eller afvises.
Sammenlignet med
Greph samler søgning og omskrivning i PHP. Disse værktøjer løser beslægtede problemer, og nogle ting kan Greph ikke.
| Værktøj | God til | Forskel fra Greph |
|---|---|---|
| ripgrep | God tilEt rekursivt regex-søgeværktøj med førsteklasses understøttelse på Windows, macOS og Linux samt binære downloads til hver udgivelse. Det følger gitignore-regler og springer som standard skjulte og binære filer over. | Forskel fra GrephGreph installeres med Composer og kører i PHP. I benchmarken for WordPress-korpusset i CI var rg hurtigere på alle kolde tekstforespørgsler, for eksempel 81,62 ms mod 458.82 ms ved bogstavelig søgning. Et varmt Greph-indeks besvarede en antalforespørgsel på 10,90 ms mod 49,61 ms for rg. |
| ast-grep | God tilEn kompileret CLI til strukturel søgning, lint og omskrivning, bygget på tree-sitter. Den har indbygget understøttelse af mange sprog, herunder PHP, og YAML-regelfiler til lintregler og kodeændringer. | Forskel fra GrephGreph håndterer kun PHP og læser ingen YAML-regler. Ved en kold scanning var sg hurtigere til array($$$ITEMS) i Grephs CI-benchmark. Grephs varme AST-indeks besvarede new $CLASS() på 10,89 ms mod 4093.61 ms for sg. |
| Rector | God tilOpgraderer og refaktorerer PHP-kode gennem regler og regelsæt med understøttelse af PHP-versioner fra 5.3 til 8.5 og projekter som Symfony, PHPUnit og Doctrine. | Forskel fra GrephGreph omskriver ud fra et mønster og en skabelon, du selv skriver. Dokumentationen fraråder værktøjet, når en ændring afhænger af typeinformation, som PHP-Parser ikke kan udlede fra en enkelt fil, eller kræver, at imports tilføjes eller fjernes på tværs af filer. |
| PHP CS Fixer | God tilRetter kode, så den følger kodningsstandarder, med indbyggede regelsæt som PER Coding Style fra PHP-FIG. | Forskel fra GrephGreph omformaterer ikke filer. Det ændrer kun den kode, et mønster matcher, og dokumentationen henviser til PHP CS Fixer, hvis du vil have et formatteringsværktøj. |
Kilder, markeret
Spørgsmål og svar
Korte svar fra Greph-dokumentationen.
Nej. Greph kører søgning og omskrivning i PHP. De eksterne binærfiler rg, grep og sg bruges kun til de valgfrie benchmark-sammenligninger.
Kun PHP. Mønstre og kildefiler parses med nikic/php-parser, og enhver anden --lang-værdi afvises som ikke understøttet.
Ikke ved kolde scanninger. I projektets CI-benchmark på WordPress-korpusset var rg og grep hurtigere på alle kolde tekstforespørgsler. Varme indeks hjælper ved gentagne forespørgsler, for eksempel 10,90 ms mod 49,61 ms for rg ved en indekseret optælling.
Greph kører i én proces. Uden pcntl_fork behandler arbejdspuljen hver blok i samme proces med samme resultat som -j 1 og uden at udløse en fejl.
Ikke uden for et match. Kode uden for de matchede byteområder bevarer mellemrum, kommentarer og layout. Den matchede kode udskrives igen ud fra skabelonen, så linjeskift normaliseres, og en kommentar inde i koden kan gå tabt. Kør først med --dry-run for at udskrive de omskrevne filer uden at skrive dem.
Som standard i .greph-index, .greph-ast-index og .greph-ast-cache i den indekserede rodmappe. Angiv --index-dir til en vilkårlig greph-index-underkommando for at bruge en anden placering.
Læs dokumentationen til Greph for reference til CLI, PHP API, de indekserede tilstande og wrapperne rg og sg.