Siirry sisältöön

Greph

Pelkkää PHP-koodia hakeva hakukone, rakenteinen haku ja uudelleenkirjoitus. grep-, ripgrep- ja ast-grep-työnkulut yhdessä Composer-paketissa.

Pääte
composer require greph/greph

Uusin julkaisu v0.2.3 MIT PHP 8.2+

Kä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.

Pääte
# 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 src

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.

Greph verrattuna muihin työkaluihin
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.

Lue Greph-dokumentaatiosta CLI-viite, PHP API, indeksoidut tilat sekä rg- ja sg-kääreet.