Ga naar de inhoud

Greph

Zuivere PHP-codezoekfunctie, structureel zoeken en rewrite-engine. grep-, ripgrep- en ast-grep-workflows in één Composer-pakket.

Terminal
composer require greph/greph

Nieuwste release v0.2.3 MIT PHP 8.2+

In de praktijk

Installeer het pakket met Composer en zoek en herschrijf vervolgens vanaf de opdrachtregel of vanuit PHP.

Zoek, vind overeenkomsten en bekijk een rewrite-voorbeeld

-F voert een zoekopdracht naar vaste tekenreeksen uit, -p accepteert een patroon in de vorm van PHP met metavariabelen zoals $CLASS, en -r voegt een vervangingssjabloon toe. --dry-run toont de herschreven bestanden zonder ze weg te schrijven.

De statische Greph-façade biedt dezelfde bewerkingen aan PHP-code. Als de vendor/bin-opdrachten als afhankelijkheid zijn geïnstalleerd, is versie 0.2.3 of hoger vereist.

Terminal
# 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

Zuiver PHP

Zoeken en herschrijven draaien in PHP 8.2+, zonder grep-, ripgrep- of ast-grep-binair bestand. Gebruikt de json-, ctype- en tokenizer-extensies, plus zlib voor de gecachte AST-opslag.

Tekst zoeken

Zoeken naar vaste tekenreeksen en met regex, met ondersteuning voor hele woorden, hoofdletterongevoelig zoeken, context, aantallen en modi voor alleen bestanden. grep-compatibele uitvoer.

AST-zoeken

Structureel zoeken in PHP-broncode met $VAR- en $$$VARIADIC-metavariabelen, herhaalde captures en JSON-uitvoer. Alleen PHP wordt ondersteund.

AST-herschrijven

Structureel herschrijven met modi voor proefuitvoering, interactief gebruik en schrijven. Alleen overeenkomende code wordt gewijzigd; opmerkingen en opmaak buiten een overeenkomst blijven behouden.

Geïndexeerde modi

Bouw een trigramtekstindex, een AST-feitenindex of een gecachte AST-opslag en hergebruik deze. In de projectbenchmark duurde het bouwen van de AST-feitenindex 1.4 s en daalde new $CLASS() van 2.9 s naar 11 ms; het bouwen van de trigramindex duurde 12.3 s.

rg- en sg-wrappers

vendor/bin/rg en vendor/bin/sg accepteren de gangbare zoekvlaggen van ripgrep en ast-grep op dezelfde engine. Niet ondersteund: multiline, --replace, --type-add en --sort in rg; YAML-regels en niet-PHP-talen in sg.

PHP API

Greph::searchText(), searchAst() en rewriteAst() retourneren getypeerde resultaatobjecten, zodat PHP-code en agents de engine zonder subprocess kunnen aanroepen.

Oracle-corpus

39 scenario's vergelijken de tekst-, AST- en rewrite-uitvoer van greph met grep, ripgrep en ast-grep. Voer ze uit met composer test:oracle in een kloon van de repository; CI voert de unit- en integratietestsuites uit.

Waarom Greph

Geen native binaries

Zoeken en herschrijven draaien binnen het PHP-proces. De rg-, grep- en sg-binaries worden alleen gebruikt voor de optionele benchmarkvergelijkingen.

Eén engine voor elke modus

Tekst zoeken, PHP structureel zoeken en herschrijven zitten in één Composer-pakket. De rg- en sg-wrappers gebruiken dezelfde engine als vendor/bin/greph.

Herschrijven raakt alleen overeenkomsten

De rewriter voegt de weergegeven sjabloon in op de bytebereiken die overeenkomen. Code buiten een overeenkomst behoudt de inspringing, opmerkingen en lege regels.

Opgewarmde indexen zonder daemon

Indexen staan op schijf en worden bij volgende uitvoeringen hergebruikt. Een lifecycleprofiel bepaalt of een verouderde index ongemoeid blijft, tijdens het zoeken wordt bijgewerkt of wordt geweigerd.

Vergeleken met

Greph houdt zoeken en herschrijven binnen PHP. Deze tools lossen verwante problemen op en doen ook dingen die Greph niet doet.

Greph vergeleken met andere tools
ripgrep Goed inEen recursieve zoektool voor regex met eersteklas ondersteuning voor Windows, macOS en Linux en binaire downloads voor elke release. De tool volgt gitignore-regels en slaat standaard verborgen en binaire bestanden over. Verschil met GrephGreph wordt geïnstalleerd met Composer en draait in PHP. In de CI-benchmark op het WordPress-corpus was rg bij elke koude tekstzoekopdracht sneller, bijvoorbeeld 81.62 ms tegenover 458.82 ms voor een letterlijke zoekopdracht. Een warme Greph-index beantwoordde een telopdracht in 10.90 ms tegenover 49.61 ms voor rg.
ast-grep Goed inEen gecompileerde CLI voor structureel zoeken, linten en herschrijven, gebouwd op tree-sitter. Heeft ingebouwde ondersteuning voor veel talen, waaronder PHP, en YAML-regelbestanden voor lintregels en codewijzigingen. Verschil met GrephGreph verwerkt alleen PHP en leest geen YAML-regels. Bij een koude scan was sg sneller voor array($$$ITEMS) in de CI-benchmark van Greph. De warme AST-index van Greph beantwoordde new $CLASS() in 10.89 ms tegenover 4093.61 ms voor sg.
Rector Goed inUpgrade- en refactorcode in PHP met regels en regelsets, met ondersteuning voor PHP-versies van 5.3 tot 8.5 en projecten zoals Symfony, PHPUnit en Doctrine. Verschil met GrephGreph herschrijft op basis van een patroon en een sjabloon dat u zelf opstelt. Volgens de documentatie is het niet geschikt wanneer een wijziging afhankelijk is van type-informatie die PHP-Parser niet uit één bestand kan afleiden, of wanneer imports over meerdere bestanden heen moeten worden toegevoegd of verwijderd.
PHP CS Fixer Goed inPast code aan de codeerstijl aan, met ingebouwde regelsets zoals de PER Coding Style van PHP-FIG. Verschil met GrephGreph herformatteert geen bestanden. Het wijzigt alleen de code waarop een patroon overeenkomt en verwijst in de documentatie naar PHP CS Fixer als u een formatter nodig hebt.

Vragen en antwoorden

Korte antwoorden uit de documentatie van Greph.

Lees de documentatie van Greph voor de referentie van CLI, de PHP API, de geïndexeerde modi en de rg- en sg-wrappers.