Greph
Ainult PHP koodiotse, struktuuriotsing ja ümberkirjutusmootor. grep-i, ripgrep ja ast-grep töövood ühes Composer paketis.
composer require greph/grephViimane väljalase 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)' srcPraktikas
Paigaldage pakett käsuga Composer, seejärel otsige ja kirjutage ümber käsurealt või PHP kaudu.
Otsige, sobitage ja eelvaadake ümberkirjutust
-F teeb fikseeritud stringiga tekstiotsingu, -p kasutab PHP-kujuga mustrit, mille metamuutujad võivad olla näiteks $CLASS, ja -r lisab asendusmalli. --dry-run kuvab ümberkirjutatud failid neid salvestamata.
Staatiline Greph fassaad pakub PHP koodile samu toiminguid. Sõltuvusena paigaldatuna vajavad käsud vendor/bin versiooni 0.2.3 või uuemat.
# 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(),
);Ainult PHP
Otsing ja ümberkirjutus käivitatakse PHP 8.2+ sees, ilma grep-i, ripgrep või ast-grep binaarfailita. Kasutab json-, ctype- ja tokenizer-laiendusi ning vahemällu salvestatud AST-hoidla jaoks zlibi.
Tekstiotsing
Fikseeritud stringi ja regulaaravaldistega otsing, terve sõna, tõstutundetuse, konteksti, loenduse ja ainult failide režiimidega. grep-ühilduv väljund.
AST-otsing
Struktuuriotsing PHP lähtekoodis, kasutades $VAR ja $$$VARIADIC metamuutujaid, korduvaid hõiveid ja JSON väljundit. Toetatud on ainult keel PHP.
AST-i ümberkirjutamine
Struktuursed ümberkirjutused eelvaate-, interaktiivse ja kirjutamisrežiimiga. Muutub ainult sobitatud kood; kommentaarid ja sobituse välised paigutuse üksikasjad jäävad samaks.
Indekseeritud režiimid
Looge trigrammteksti indeks, AST-faktide indeks või vahemällu salvestatud AST-hoidla ning kasutage seda korduvalt. Projekti võrdlustestis kulus AST-faktide indeksi loomiseks 1.4 s ja see vähendas new $CLASS() aega 2.9 sekundilt 11 millisekundile; trigrammiindeksi loomine võttis 12.3 s.
rg- ja sg-ümbrised
vendor/bin/rg ja vendor/bin/sg aktsepteerivad samal mootoril tavapäraseid ripgrep ja ast-grep otsingulippe. Puudu on: rg-s mitmerealine otsing, --replace, --type-add ja --sort; sg-s reeglid YAML ja mitte-PHP keeled.
PHP API
Greph::searchText(), searchAst() ja rewriteAst() tagastavad tüübistatud tulemuseobjekte, nii et PHP kood ja agendid saavad mootorit kasutada alamprotsessita.
Võrdluskorpus
39 stsenaariumi võrdlevad greph-i teksti-, AST- ja ümberkirjutusväljundit grep-i, ripgrep ja ast-grep omadega. Käivitage need hoidla kloonis käsuga composer test:oracle; CI käivitab ühik- ja integratsioonitestid.
Miks Greph
Natiivseid binaarfaile pole vaja
Otsing ja ümberkirjutus käivitatakse PHP protsessis. rg, grep ja sg binaarfaile kasutatakse ainult valikulistes võrdlustestides.
Üks mootor kõigi režiimide jaoks
Tekstiotsing, PHP struktuuriotsing ja ümberkirjutus on ühes Composer paketis. rg- ja sg-ümbrised kasutavad sama mootorit mis vendor/bin/greph.
Ümber kirjutatakse ainult vasted
Ümberkirjutaja põimib renderdatud malli sobitatud baidivahemikesse. Sobituse väline kood säilitab taanded, kommentaarid ja tühjad read.
Soojendatud indeksid ilma taustaprotsessita
Indeksid asuvad kettal ja neid kasutatakse eri käivituskordadel uuesti. Elutsükliprofiil määrab, kas aegunud indeks jäetakse muutmata, värskendatakse otsingu ajal või lükatakse tagasi.
Võrdlus
Greph hoiab otsingu ja ümberkirjutuse PHP sees. Need tööriistad lahendavad sarnaseid probleeme ja saavad mõne asjaga hakkama, millega Greph toime ei tule.
| Tööriist | Sobib hästi | Erinevus võrreldes Greph-ga |
|---|---|---|
| ripgrep | Sobib hästiRekursiivse regulaaravaldisotsingu tööriist, mille esmaklassiline tugi hõlmab Windows, macOS ja Linux ning mille iga väljalaske jaoks on binaarfailide allalaadimised. Järgib gitignore'i reegleid ning jätab peidetud ja binaarfailid vaikimisi vahele. | Erinevus võrreldes Greph-gaGreph paigaldatakse käsuga Composer ja see töötab PHP sees. Projekti WordPress korpuse CI-võrdlustestis oli rg iga külma tekstiotsingu puhul kiirem, näiteks literaalse otsingu korral 81.62 ms, võrreldes 458.82 ms-ga. Soojendatud Greph indeks vastas loenduspäringule 10.90 ms-ga, rg-l kulus 49.61 ms. |
| ast-grep | Sobib hästiKompileeritud CLI struktuuriotsinguks, lintimiseks ja ümberkirjutuseks, mis põhineb tree-sitteril. Sisseehitatud tugi hõlmab paljusid keeli, sealhulgas PHP, ning lintimisreeglite ja koodimuudatuste jaoks on YAML reeglifailid. | Erinevus võrreldes Greph-gaGreph käsitleb ainult PHP ega loe YAML reegleid. Projekti Greph CI-võrdlustestis oli sg külmal skannimisel array($$$ITEMS) puhul kiirem. Greph soe AST-indeks vastas päringule new $CLASS() 10.89 ms-ga; sg-l kulus 4093.61 ms. |
| Rector | Sobib hästiUuendab ja refaktoreerib reeglite ning reeglikogumite abil PHP koodi, toetades versioone PHP vahemikus 5.3 kuni 8.5 ning projekte nagu Symfony, PHPUnit ja Doctrine. | Erinevus võrreldes Greph-gaGreph teeb ümberkirjutusi teie loodud mustri ja malli põhjal. Dokumentatsiooni järgi ei sobi see olukorras, kus muudatus sõltub tüübiteabest, mida PHP-Parser ei suuda ühe faili põhjal tuvastada, või kus importimisi tuleb failide vahel lisada või eemaldada. |
| PHP CS Fixer | Sobib hästiParandab koodi, et see vastaks kodeerimisstandarditele, ning sisaldab sisseehitatud reeglikogumeid, näiteks PHP-FIG-i PER-i stiilijuhendit. | Erinevus võrreldes Greph-gaGreph ei vorminda faile ümber. See muudab ainult mustriga sobitatud koodi; vormindaja kasutamisel suunab dokumentatsioon PHP CS Fixer juurde. |
Allikad, märgitud
Küsimused ja vastused
Lühikesed vastused Greph dokumentatsioonist.
Ei. Greph teeb otsingu ja ümberkirjutuse PHP sees. Väliseid rg, grep ja sg binaarfaile kasutatakse ainult valikulistes võrdlustestides.
Ainult PHP. Mustreid ja lähtefaile parsitakse nikic/php-parser abil ning mis tahes muud --lang väärtust ei toetata.
Külmade skannimiste puhul mitte. Projekti CI-võrdlustestis, mis kasutas korpust WordPress, olid rg ja grep iga külma tekstiotsingu puhul kiiremad. Soojad indeksid aitavad korduvate päringute korral: indekseeritud loenduspäringule vastas mootor 10.90 ms-ga, rg-l kulus 49.61 ms.
Greph töötab ühe protsessiga. Ilma pcntl_fork-ita käitab töölõimede kogum kõiki osi samas protsessis. Tulemus on sama nagu suvandiga -j 1 ja veateadet ei teki.
Vasteväliseid osi mitte. Sobitatud baidivahemikest väljapoole jääv kood säilitab tühikud, kommentaarid ja paigutuse. Sobitatud kood prinditakse mallist uuesti, seega reavahetused ühtlustatakse ja selle sees olev kommentaar võib kaduma minna. Käivitage esmalt suvandiga --dry-run, et näha ümberkirjutatud faile neid salvestamata.
Vaikimisi indekseeritava juurkausta kataloogidesse .greph-index, .greph-ast-index ja .greph-ast-cache. Teise asukoha kasutamiseks edastage mis tahes greph-indexi alamkäsule suvand --index-dir.
Lugege Greph dokumentatsioonist CLI viite, PHP API, indekseeritud režiimide ning rg- ja sg-ümbriste kohta.