Greph
Tisztán PHP-alapú kódkereső, szerkezeti kereső és átíró motor. grep-, ripgrep- és ast-grep-munkafolyamatok egyetlen Composer-csomagban.
composer require greph/grephLegújabb kiadás 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)' srcA 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.
# 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(),
);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.
| Eszköz | Amiben jó | Különbségek Greph-hoz képest |
|---|---|---|
| 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. |
Források, bejelölve
Kérdések és válaszok
Rövid válaszok a Greph dokumentációjából.
Nem. A Greph a keresést és az átírást PHP-ban végzi. A külső rg, grep és sg binárisokat csak az opcionális teljesítményteszt-összehasonlítások használják.
Csak a PHP nyelvet. A mintákat és a forrásfájlokat a nikic/php-parser segítségével elemzi, minden más --lang értéket pedig nem támogatottként utasít el.
Hideg kereséseknél nem. A projekt WordPress korpuszon végzett CI-teljesítménytesztjében az rg és a grep minden hideg szöveges lekérdezésnél gyorsabb volt. Az indexek felmelegítése segíti az ismételt lekérdezéseket: például indexelt darabszám-lekérdezésnél az rg 49,61 ms-os idejével szemben 10,90 ms-ot értek el.
A Greph egyetlen folyamatban fut. A pcntl_fork nélkül a munkafolyamat-készlet minden darabot a folyamaton belül dolgoz fel, a -j 1 kapcsolóval azonos eredményt ad, és nem jelez hibát.
Az egyezésen kívül nem. Az egyező bájttartományokon kívüli kód megőrzi a szóközeit, megjegyzéseit és elrendezését. Az egyező kódot a sablonból újraállítja, így a sortörései egységesülnek, és a benne lévő megjegyzés elveszhet. Először a --dry-run kapcsolóval futtassa, így mentés nélkül kiírja az átírt fájlokat.
Alapértelmezés szerint az indexelt gyökérben, a .greph-index, .greph-ast-index és .greph-ast-cache könyvtárakban. Másik hely használatához adja meg a --index-dir kapcsolót bármely greph-index alparancsnak.
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.