Ugrás a tartalomhoz

Greph

Tisztán PHP-alapú kódkereső, szerkezeti kereső és átíró motor. grep-, ripgrep- és ast-grep-munkafolyamatok egyetlen Composer-csomagban.

Terminál
composer require greph/greph

Legújabb kiadás v0.2.3 MIT PHP 8.2+

A gyakorlatban

Telepítse a csomagot a Composer segítségével, majd keressen és írjon át a parancssorból vagy a PHP felületéről.

Keressen, illesszen mintát, és tekintse meg az átírást

A -F rögzített karakterláncos szövegkeresést végez, a -p metaváltozókat, például a $CLASS elemet tartalmazó, PHP alakú mintát fogad, a -r pedig csere-sablont ad hozzá. A --dry-run kiírja az átírt fájlokat, de nem menti őket.

A statikus Greph-homlokzat ugyanezeket a műveleteket teszi elérhetővé a PHP-kód számára. Függőségként telepítve a vendor/bin parancsokhoz legalább 0.2.3 verzió szükséges.

Terminál
# 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

Tisztán PHP-alapú

A keresés és az átírás PHP 8.2+-ban fut, grep-, ripgrep- vagy ast-grep-bináris nélkül. A json, ctype és tokenizer bővítményeket, valamint a zlibet használja a gyorsítótárazott AST-tárhoz.

Szövegkeresés

Keresés rögzített karakterlánccal vagy reguláris kifejezéssel, teljes szavas, kis- és nagybetűkre érzéketlen, kontextus-, darabszám- és csak fájlokat felsoroló módokkal. grep-kompatibilis kimenet.

AST-keresés

Szerkezeti keresés PHP-forráskódban, $VAR és $$$VARIADIC met változókkal, ismételt rögzítésekkel és JSON kimenettel. Csak a PHP nyelv támogatott.

AST-átírás

Szerkezeti átírások próbafuttatási, interaktív és írási móddal. Csak az egyező kód változik; az egyezésen kívüli megjegyzések és elrendezés változatlan marad.

Indexelt módok

Hozzon létre trigram szövegindexet, AST-tényindexet vagy gyorsítótárazott AST-tárat, és használja újra. A projekt teljesítménytesztjében az AST-tényindex 1,4 s alatt épült fel, és a new $CLASS() futását 2,9 s-ról 11 ms-ra csökkentette; a trigramindex 12,3 s alatt épült fel.

rg- és sg-burkolók

A vendor/bin/rg és a vendor/bin/sg ugyanazon a motoron fogadja a gyakori ripgrep- és ast-grep-keresési kapcsolókat. Nem támogatott: a többsoros keresés, a --replace, a --type-add és a --sort az rg-ben; a YAML-szabályok és a nem PHP nyelvek az sg-ben.

PHP API

A Greph::searchText(), a searchAst() és a rewriteAst() típusos eredményobjektumokat ad vissza, így a PHP-kód és az ügynökök alfolyamat indítása nélkül hívhatják meg a motort.

Oracle-korpusz

39 forgatókönyv hasonlítja össze a greph szöveges, AST- és átírási kimenetét a grep, a ripgrep és a ast-grep kimenetével. Futtassa őket a composer test:oracle paranccsal a tároló klónjában; a CI az egység- és integrációs tesztcsomagokat futtatja.

Miért Greph?

Nincsenek natív binárisok

A keresés és az átírás a PHP folyamatán belül fut. Az rg, grep és sg binárisokat csak az opcionális teljesítményteszt-összehasonlítások használják.

Egy motor minden módhoz

A szövegkeresés, a PHP szerkezeti keresés és az átírás egyetlen Composer-csomagban található. Az rg- és sg-burkolók ugyanazt a motort hívják meg, mint a vendor/bin/greph.

Az átírás csak az egyezéseket módosítja

Az átíró a megjelenített sablont az egyező bájttartományokba illeszti. Az egyezésen kívüli kód megőrzi a behúzását, megjegyzéseit és üres sorait.

Bemelegített indexek démon nélkül

Az indexek lemezen tárolódnak, és a futtatások között újra felhasználhatók. Egy életciklusprofil határozza meg, hogy az elavult index érintetlen maradjon, keresés közben frissüljön, vagy a rendszer visszautasítsa.

Összehasonlítás

A Greph a keresést és az átírást PHP-ban tartja. Ezek az eszközök hasonló problémákat oldanak meg, és vannak olyan feladataik, amelyeket a Greph nem végez el.

Greph összehasonlítása más eszközökkel
ripgrep Amiben jóRekurzív reguláriskifejezés-kereső eszköz, amely elsőrangúan támogatja a Windows, a macOS és a Linux rendszert, és minden kiadáshoz bináris letöltést kínál. Alapértelmezés szerint figyelembe veszi a gitignore-szabályokat, és kihagyja a rejtett, illetve bináris fájlokat. Különbségek Greph-hoz képestA Greph a Composer segítségével telepíthető, és PHP-ban fut. A WordPress korpuszon végzett CI-teljesítménytesztben az rg minden hideg szöveges lekérdezésnél gyorsabb volt, például egy literális keresés 81,62 ms alatt futott le, szemben a 458.82 ms-mal. A Greph meleg indexe 10,90 ms alatt válaszolt egy darabszám-lekérdezésre, míg az rg-nek 49,61 ms kellett.
ast-grep Amiben jóFordítás után használható CLI szerkezeti kereséshez, linteléshez és átíráshoz, tree-sitterre építve. Számos nyelvet támogat beépítetten, köztük a PHP nyelvet, és YAML-szabályfájlokkal lintelési szabályokat és kódmódosításokat is megadhat. Különbségek Greph-hoz képestA Greph csak a PHP nyelvet kezeli, és nem olvas be YAML-szabályokat. Hideg keresésnél az sg gyorsabb volt a array($$$ITEMS) esetén a Greph CI-teljesítménytesztjében. A Greph meleg AST-indexe 10,89 ms alatt válaszolt a new $CLASS() lekérdezésre, míg az sg-nek 4093.61 ms kellett.
Rector Amiben jóSzabályokkal és szabálykészletekkel frissíti és refaktorálja a PHP-kódot, támogatva a PHP verzióit az 5.3-tól a 8.5-ig, valamint olyan projekteket, mint a Symfony, a PHPUnit és a Doctrine. Különbségek Greph-hoz képestA Greph egy Ön által írt minta és sablon alapján végez átírást. A dokumentáció szerint nem használható, ha a módosítás olyan típusinformációtól függ, amelyet a PHP-Parser egyetlen fájlból nem tud feloldani, vagy ha fájlok között kell importokat hozzáadni vagy eltávolítani.
PHP CS Fixer Amiben jóA kódolási szabványoknak megfelelően javítja a kódot, beépített szabálykészletekkel, például a PHP-FIG PER kódolási stílussal. Különbségek Greph-hoz képestA Greph nem formázza újra a fájlokat. Csak a minta által egyezőnek talált kódot módosítja, a dokumentáció pedig a PHP CS Fixer eszközt javasolja, ha formázóra van szüksége.

Kérdések és válaszok

Rövid válaszok a Greph dokumentációjából.

Olvassa el a Greph dokumentációját a CLI referenciához, a PHP API részhez, az indexelt módokhoz, valamint az rg- és sg-burkolókhoz.