Greph
Grynai PHP kodo paieška, struktūrinė paieška ir perrašymo variklis. grep, ripgrep ir ast-grep darbo eigos viename Composer pakete.
composer require greph/grephNaujausia versija 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)' srcPraktinis pritaikymas
Įdiekite paketą naudodami Composer, tada ieškokite ir perrašykite komandinėje eilutėje arba iš PHP.
Ieškokite, raskite atitikmenis ir peržiūrėkite perrašymą
-F atlieka paiešką pagal tikslią teksto eilutę, -p priima PHP tipo šabloną su metakintamaisiais, pavyzdžiui, $CLASS, o -r prideda pakeitimo šabloną. --dry-run išveda perrašytus failus jų neįrašydamas.
Statinis Greph fasadas pateikia tas pačias operacijas PHP kodui. Įdiegtoms kaip priklausomybė, vendor/bin komandoms reikia 0.2.3 arba naujesnės versijos.
# 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(),
);Grynai PHP
Paieška ir perrašymas veikia naudojant PHP 8.2+, be grep, ripgrep ar ast-grep dvejetainės programos. Naudoja json, ctype ir tokenizer plėtinius bei zlib AST talpyklai.
Teksto paieška
Paieška pagal tikslią eilutę ir reguliariąsias išraiškas, palaikanti viso žodžio, raidžių registro ignoravimo, konteksto, skaičiavimo ir tik failų režimus. Išvestis suderinama su grep.
AST paieška
Struktūrinė PHP šaltinio paieška su $VAR ir $$$VARIADIC metakintamaisiais, pasikartojančiais fiksavimais ir JSON išvestimi. Palaikoma tik kalba PHP.
AST perrašymas
Struktūrinis perrašymas bandomuoju, interaktyviuoju ir įrašymo režimais. Keičiama tik atitinkanti kodo dalis; už atitikmens ribų esantys komentarai ir išdėstymas lieka nepakitę.
Indeksuoti režimai
Sukurkite trijų simbolių sekų teksto indeksą, AST faktų indeksą arba AST talpyklą ir naudokite ją pakartotinai. Projekto našumo teste AST faktų indeksas sukurtas per 1.4 s ir sutrumpino new $CLASS() laiką nuo 2.9 s iki 11 ms; trijų simbolių sekų indeksas sukurtas per 12.3 s.
rg ir sg apvalkalai
vendor/bin/rg ir vendor/bin/sg tame pačiame variklyje priima įprastas ripgrep ir ast-grep paieškos vėliavėles. Nepalaikoma: kelių eilučių paieška, --replace, --type-add ir --sort programoje rg; YAML taisyklės ir ne PHP kalbos programoje sg.
PHP API
Greph::searchText(), searchAst() ir rewriteAst() grąžina tipizuotus rezultatų objektus, todėl PHP kodas ir agentai gali iškviesti variklį be antrinio proceso.
Etaloninis korpusas
39 scenarijuose lyginama greph teksto, AST ir perrašymo išvestis su grep, ripgrep ir ast-grep. Paleiskite juos su composer test:oracle saugyklos klone; CI vykdo vienetų ir integracinius rinkinius.
Kodėl Greph
Nėra savųjų dvejetainių failų
Paieška ir perrašymas vykdomi PHP procese. rg, grep ir sg dvejetainiai failai naudojami tik pasirenkamiems našumo palyginimams.
Vienas variklis visiems režimams
Teksto paieška, PHP struktūrinė paieška ir perrašymas veikia viename Composer pakete. rg ir sg apvalkalai naudoja tą patį variklį kaip vendor/bin/greph.
Perrašymas paliečia tik atitikmenis
Perrašymo įrankis įterpia sugeneruotą šabloną į atitinkančius baitų intervalus. Už atitikmens ribų esantis kodas išlaiko įtraukas, komentarus ir tuščias eilutes.
Įkelti indeksai veikia be tarnybos
Indeksai saugomi diske ir naudojami pakartotinių paleidimų metu. Gyvavimo ciklo profilis nustato, ar pasenęs indeksas paliekamas nepakeistas, atnaujinamas paieškos metu, ar atmetamas.
Palyginimas su
Greph paieška ir perrašymas atliekami PHP. Šie įrankiai sprendžia susijusias problemas, o kai kurių dalykų Greph atlikti negali.
| Įrankis | Stipriosios pusės | Skirtumas nuo Greph |
|---|---|---|
| ripgrep | Stipriosios pusėsRekursinės paieškos reguliariosiomis išraiškomis įrankis, iš karto palaikantis Windows, macOS ir Linux, taip pat siūlantis kiekvieno leidimo dvejetainius atsisiuntimus. Pagal numatytuosius nustatymus paiso gitignore taisyklių ir praleidžia paslėptus bei dvejetainius failus. | Skirtumas nuo GrephGreph įdiegiamas naudojant Composer ir veikia PHP aplinkoje. CI našumo teste WordPress korpuse rg buvo greitesnis atliekant kiekvieną šaltą teksto užklausą, pavyzdžiui, pažodinės paieškos trukmė buvo 81.62 ms, palyginti su 458.82 ms. Įkeltas Greph indeksas atsakė į skaičiavimo užklausą per 10.90 ms, o rg užtruko 49.61 ms. |
| ast-grep | Stipriosios pusėsKompiliuotas CLI struktūrinei paieškai, lint patikroms ir perrašymui, sukurtas naudojant tree-sitter. Jis turi įtaisytą daugelio kalbų palaikymą, tarp jų – PHP, ir YAML taisyklių failus lint patikroms bei kodo pakeitimams. | Skirtumas nuo GrephGreph apdoroja tik PHP ir nuskaito YAML taisykles. Šalto skenavimo metu sg buvo greitesnis nei array($$$ITEMS) CI našumo teste, atliktame Greph. Įkeltas AST indeksas, kurį turi Greph, į new $CLASS() atsakė per 10.89 ms, o sg užtruko 4093.61 ms. |
| Rector | Stipriosios pusėsAtnaujina ir refaktorizuoja PHP kodą, taikydamas taisykles ir jų rinkinius. Palaikomos PHP versijos nuo 5.3 iki 8.5 ir tokie projektai kaip Symfony, PHPUnit bei Doctrine. | Skirtumas nuo GrephGreph perrašo kodą pagal jūsų parašytą šabloną ir šablono pakaitalą. Dokumentacijoje nurodoma jo nenaudoti, kai pakeitimui reikalingos tipo informacijos PHP-Parser negali nustatyti iš vieno failo arba kai reikia pridėti ar pašalinti importus keliuose failuose. |
| PHP CS Fixer | Stipriosios pusėsPataiso kodą pagal kodavimo standartus, naudodamas įtaisytus taisyklių rinkinius, pavyzdžiui, PHP-FIG PER kodavimo stilių. | Skirtumas nuo GrephGreph neperformatuoja failų. Jis keičia tik šabloną atitinkantį kodą; jei reikia formatuoklio, dokumentacijoje siūloma naudoti PHP CS Fixer. |
Šaltiniai, pažymėta
Klausimai ir atsakymai
Trumpi atsakymai iš Greph dokumentacijos.
Ne. Greph paiešką ir perrašymą vykdo PHP. Išoriniai rg, grep ir sg dvejetainiai failai naudojami tik pasirenkamiems našumo palyginimams.
Tik PHP. Šablonai ir šaltinio failai analizuojami naudojant nikic/php-parser, o bet kokia kita --lang reikšmė atmetama kaip nepalaikoma.
Šalto skenavimo metu – ne. Projekto CI našumo teste, atliktame WordPress korpuse, rg ir grep buvo greitesni atliekant kiekvieną šaltą teksto užklausą. Įkelti indeksai padeda vykdant užklausas pakartotinai; pavyzdžiui, indeksuoto skaičiavimo užklausa rg užtruko 49.61 ms, o čia – 10.90 ms.
Greph veikia viename procese. Jei nėra pcntl_fork, darbuotojų telkinys apdoroja kiekvieną dalį tame pačiame procese, rezultatas toks pat kaip naudojant -j 1, o klaida nekeliama.
Už atitikmens ribų – ne. Kodas už atitinkančių baitų intervalų ribų išlaiko tarpus, komentarus ir išdėstymą. Atitinkantis kodas iš naujo atspausdinamas iš šablono, todėl eilučių lūžiai sunorminami, o jame esantis komentaras gali būti prarastas. Pirmiausia paleiskite su --dry-run, kad perrašyti failai būtų parodyti jų neįrašant.
Pagal numatytuosius nustatymus indeksuojamos šakninės direktorijos aplankuose .greph-index, .greph-ast-index ir .greph-ast-cache. Norėdami naudoti kitą vietą, perduokite --index-dir bet kuriai greph-index poaibio komandai.
Skaitykite Greph dokumentaciją, kurioje rasite CLI nuorodą, PHP API, indeksuotus režimus ir rg bei sg apvalkalus.