Greph
Pelkkää PHP-koodia hakeva hakukone, rakenteinen haku ja uudelleenkirjoitus. grep-, ripgrep- ja ast-grep-työnkulut yhdessä Composer-paketissa.
composer require greph/grephUusin julkaisu 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)' srcKäytännössä
Asenna paketti komennolla Composer ja hae sekä kirjoita uudelleen komentoriviltä tai PHP-koodista.
Hae, täsmää ja esikatsele uudelleenkirjoitus
-F suorittaa kiinteän merkkijonon tekstihakua, -p ottaa vastaan PHP-tyylisen kuvion, jossa on esimerkiksi metamuuttujia $CLASS, ja -r lisää korvauspohjan. --dry-run tulostaa uudelleenkirjoitetut tiedostot kirjoittamatta niitä levylle.
Staattinen Greph-julkisivu tarjoaa samat toiminnot PHP-koodille. Riippuvuutena asennettavat vendor/bin-komennot vaativat vähintään version 0.2.3.
# 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(),
);Pelkkää PHP-koodia
Haku ja uudelleenkirjoitus toimivat PHP 8.2+:ssa ilman grep-, ripgrep- tai ast-grep-binääritiedostoa. Käyttää json-, ctype- ja tokenizer-laajennuksia sekä zlibiä välimuistissa olevaan AST-tietovarastoon.
Tekstihaku
Kiinteän merkkijonon ja regexien haku kokonaisen sanan, kirjainkoosta riippumattoman haun, kontekstin, määrän ja vain tiedostoihin kohdistuvin tiloin. grep-yhteensopiva tuloste.
AST-haku
Rakenteinen haku lähdekoodista PHP käyttäen $VAR- ja $$$VARIADIC-metamuuttujia, toistuvia kaappauksia ja JSON-tulostetta. PHP on ainoa tuettu kieli.
AST:n uudelleenkirjoitus
Rakenteiset uudelleenkirjoitukset koeajolla, vuorovaikutteisella tilalla ja kirjoitustilalla. Vain osumat muuttuvat; kommentit ja asettelu osumien ulkopuolella säilyvät ennallaan.
Indeksoidut tilat
Rakenna trigrammiteksti-indeksi, AST-tietoindeksi tai AST-välimuistivarasto kerran ja käytä sitä uudelleen. Projektin vertailutestissä AST-tietoindeksin rakentaminen kesti 1.4 s ja lyhensi ajan new $CLASS() 2.9 s:sta 11 ms:iin; trigrammi-indeksin rakentaminen kesti 12.3 s.
rg- ja sg-kääreet
vendor/bin/rg ja vendor/bin/sg hyväksyvät tavalliset ripgrep- ja ast-grep-hakuvalitsimet samassa hakukoneessa. Ei tuettu: monirivihaku, --replace, --type-add ja --sort rg:ssä; YAML-säännöt ja muut kuin PHP-kielet sg:ssä.
PHP API
Greph::searchText(), searchAst() ja rewriteAst() palauttavat tyypitettyjä tulosobjekteja, joten PHP-koodi ja agentit voivat kutsua hakukonetta ilman aliprosessia.
Oraakkelikorpus
39 skenaariossa verrataan grephin teksti-, AST- ja uudelleenkirjoitustulosteita grep-, ripgrep- ja ast-grep-tulosteisiin. Suorita ne komennolla composer test:oracle repositoryn kloonissa; CI suorittaa yksikkö- ja integraatiotestit.
Miksi Greph
Ei natiivibinäärejä
Haku ja uudelleenkirjoitus toimivat PHP-prosessin sisällä. rg-, grep- ja sg-binäärejä käytetään vain valinnaisiin vertailutesteihin.
Yksi hakukone kaikkiin tiloihin
Tekstihaku, PHP-rakenteinen haku ja uudelleenkirjoitus ovat samassa Composer-paketissa. rg- ja sg-kääreet kutsuvat samaa hakukonetta kuin vendor/bin/greph.
Uudelleenkirjoitus muuttaa vain osumia
Uudelleenkirjoittaja sijoittaa hahmonnetun mallin täsmääville tavuväleille. Osumien ulkopuolinen koodi säilyttää sisennyksensä, kommenttinsa ja tyhjät rivinsä.
Lämpimät indeksit ilman taustapalvelua
Indeksit tallennetaan levylle ja niitä käytetään uudelleen ajokertojen välillä. Elinkaariprofiili määrittää, jätetäänkö vanhentunut indeksi ennalleen, päivitetäänkö se haun aikana vai hylätäänkö se.
Vertailu
Greph pitää haun ja uudelleenkirjoituksen PHP:ssa. Nämä työkalut ratkaisevat samankaltaisia ongelmia, ja Greph tekee joitakin asioita, joihin se ei pysty.
| Työkalu | Sopii hyvin | Ero kohteeseen Greph |
|---|---|---|
| ripgrep | Sopii hyvinRekursiivinen regex-hakutyökalu, jossa on ensiluokkainen tuki kohteille Windows, macOS ja Linux sekä binäärilataukset jokaiseen julkaisuun. Noudattaa gitignore-sääntöjä ja ohittaa oletusarvoisesti piilotetut ja binääritiedostot. | Ero kohteeseen GrephGreph asennetaan Composer:llä ja se toimii PHP:ssa. Projektin WordPress-korpuksella tehdyssä CI-vertailussa rg oli nopeampi jokaisessa kylmässä tekstikyselyssä, esimerkiksi kirjaimellisessa haussa 81.62 ms verrattuna 458.82 ms:iin. Lämmitetty Greph-indeksi vastasi määräkyselyyn 10.90 ms:ssa, rg:ltä siihen kului 49.61 ms. |
| ast-grep | Sopii hyvinKäännetty CLI rakenteiseen hakuun, lint-tarkistukseen ja uudelleenkirjoitukseen, perustuu tree-sitteriin. Sisäänrakennettu tuki kattaa monia kieliä, kuten PHP, ja YAML-sääntötiedostoilla voi määrittää lint-säännöt ja koodimuutokset. | Ero kohteeseen GrephGreph käsittelee vain kohdetta PHP eikä lue YAML-sääntöjä. Kylmässä haussa sg oli nopeampi kohteelle array($$$ITEMS) ohjelman Greph CI-vertailussa. Greph:n lämmin AST-indeksi vastasi kohteeseen new $CLASS() 10.89 ms:ssa, kun sg:ltä kului 4093.61 ms. |
| Rector | Sopii hyvinPäivittää ja refaktoroi PHP-koodia sääntöjen ja sääntökokoelmien avulla. Tukee PHP-versioita 5.3–8.5 ja projekteja kuten Symfony, PHPUnit ja Doctrine. | Ero kohteeseen GrephGreph tekee uudelleenkirjoituksia itse määrittämäsi kuvion ja mallin pohjalta. Dokumentaatio ei suosittele sitä muutoksiin, jotka riippuvat tyyppitiedoista, joita PHP-Parser ei pysty ratkaisemaan yhdestä tiedostosta, tai joissa tuonteja on lisättävä tai poistettava tiedostojen välillä. |
| PHP CS Fixer | Sopii hyvinKorjaa koodin noudattamaan koodausstandardeja sisäänrakennetuilla sääntökokoelmilla, kuten PHP-FIGin PER-koodaustyyli. | Ero kohteeseen GrephGreph ei muotoile tiedostoja uudelleen. Se muuttaa vain kuvion täsmäämää koodia, ja dokumentaatio suosittelee PHP CS Fixer-työkalua, kun haluat muotoilijan. |
Kysymykset ja vastaukset
Lyhyet vastaukset Greph-dokumentaatiosta.
Ei. Greph suorittaa haun ja uudelleenkirjoituksen PHP:ssa. Ulkoisia rg-, grep- ja sg-binäärejä käytetään vain valinnaisiin vertailutesteihin.
Vain PHP. Kuviot ja lähdetiedostot jäsennetään työkalulla nikic/php-parser, ja kaikki muut --lang-arvot hylätään tukemattomina.
Ei kylmässä haussa. Projektin WordPress-korpuksella tehdyssä CI-vertailussa rg ja grep olivat nopeampia jokaisessa kylmässä tekstikyselyssä. Lämpimät indeksit nopeuttavat toistuvia kyselyjä: indeksoitu määrähaku kesti esimerkiksi 10.90 ms verrattuna rg:n 49.61 ms:iin.
Greph toimii yhden prosessin voimin. Ilman pcntl_forkia työntekijäpooli käsittelee jokaisen osan samassa prosessissa; tulos vastaa -j 1 -asetusta eikä virhettä synny.
Ei täsmäävien kohtien ulkopuolella. Täsmäävien tavuvälien ulkopuolinen koodi säilyttää välilyöntinsä, kommenttinsa ja asettelunsa. Täsmäävä koodi tulostetaan uudelleen mallista, joten sen rivinvaihdot yhdenmukaistetaan ja sen sisältämä kommentti voi kadota. Tulosta uudelleenkirjoitetut tiedostot ensin asetuksella --dry-run, joka ei kirjoita niitä levylle.
Oletusarvoisesti indeksoidun juuren hakemistoihin .greph-index, .greph-ast-index ja .greph-ast-cache. Määritä toinen sijainti välittämällä --index-dir mille tahansa greph-index-alakomennolle.
Lue Greph-dokumentaatiosta CLI-viite, PHP API, indeksoidut tilat sekä rg- ja sg-kääreet.