Guida introduttiva
Installazione
Installa Greph tramite Composer:
composer require greph/greph
Questo installa la libreria e quattro eseguibili in vendor/bin/:
greph: ricerca testuale nativa, ricerca AST e riscrittura ASTgreph-index: indice testuale precaricato, indice dei fatti AST e ricerca AST memorizzata nella cacherg: wrapper di compatibilità in stile ripgrepsg: wrapper di compatibilità in stile ast-grep
Questi eseguibili funzionano dalla vendor/bin/ del progetto, poiché Greph 0.2.3. Le versioni precedenti trovavano l'autoloader di Composer solo all'interno di un clone del repository Greph, quindi è richiesta almeno quella versione:
composer require greph/greph:^0.2.3
Requisiti
- PHP 8.2+ per classi readonly, enum, sintassi callable di prima classe e promozione dei parametri nel costruttore
- ext-json per l'output JSON e i payload degli indici su disco
- ext-ctype per analizzare pattern e opzioni
- ext-tokenizer per PHP-Parser e i prefiltri AST
- ext-zlib per l'archivio AST nella cache (
greph-index ast-cache) - nikic/php-parser (installato automaticamente come dipendenza di Composer)
ext-json, ext-ctype e ext-tokenizer sono abilitati in quasi tutte le build di PHP. composer.json dichiara al momento solo ext-json (#5), quindi Composer non avvisa se ne manca uno degli altri.
Facoltativo:
- ext-pcntl per le scansioni parallele. Greph passa senza problemi all'esecuzione a processo singolo se manca.
- Binari esterni di
rg,grepesgper i confronti dei benchmark. Non sono mai richiesti in fase di esecuzione.
La ricerca, la riscrittura e l'indicizzazione non chiamano mai proc_open() o shell_exec(); solo le scansioni parallele creano processi figli e passano a un singolo processo se manca pcntl_fork(). Consultate Host con processi limitati per gli host che disabilitano proc_open(), shell_exec() o pcntl_fork().
La prima ricerca testuale
La modalità predefinita di Greph è la ricerca testuale compatibile con grep:
vendor/bin/greph -F "function" src
L'output usa il formato canonico file:line:content previsto da grep, ripgrep e dalla maggior parte delle integrazioni degli editor.
src/Greph.php:41: public static function walk(string|array $paths, ?WalkOptions $options = null): FileList
src/Greph.php:50: public static function searchText(string $pattern, string|array $paths, ?TextSearchOptions $options = null): array
src/Greph.php:81: public static function buildTextIndex(
Aggiungete -i per ignorare la distinzione tra maiuscole e minuscole, -w per la corrispondenza di parole intere, -c per i conteggi, -l per i soli percorsi dei file, -C 2 per due righe di contesto e così via. L'elenco completo si trova nel riferimentoCLI.
La prima ricerca AST
Passate -p e un pattern in formato PHP per passare alla ricerca strutturale:
vendor/bin/greph -p 'new $CLASS()' src
$CLASS è una metavariabile che acquisisce qualsiasi nome di classe. Il pattern new $CLASS() corrisponde a ogni espressione new senza argomenti, indipendentemente dalla classe, dalla formattazione o dai commenti. Usate new $CLASS($$$ARGS) per trovare chiamate con qualsiasi argomento.
Ogni corrispondenza AST viene stampata indicando il file, la riga iniziale e il codice corrispondente:
src/Greph.php:43:new FileWalker()
src/Greph.php:52:new TextSearchOptions()
src/Greph.php:54:new TextSearcher()
Altri pattern utili:
# 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)' src
Consultate Modalità / Ricerca AST per la sintassi completa dei pattern.
La prima riscrittura
Aggiungete -r per trasformare la ricerca AST in una riscrittura:
# Preview only
vendor/bin/greph -p 'array($$$ITEMS)' -r '[$$$ITEMS]' --dry-run src
# Apply
vendor/bin/greph -p 'array($$$ITEMS)' -r '[$$$ITEMS]' src
# Confirm each file before writing
vendor/bin/greph -p 'array($$$ITEMS)' -r '[$$$ITEMS]' --interactive src
Le riscritture preservano la formattazione al di fuori della corrispondenza: viene sostituito solo il nodo corrispondente, mentre spazi, indentazione e commenti circostanti restano intatti. Il nodo corrispondente viene ricreato dal template, quindi il suo layout viene normalizzato e un commento al suo interno può andare perso. Per i dettagli, consultate Modalità / Riscrittura.
PHP API
La facciata statica Greph\Greph espone le stesse operazioni di CLI:
use Greph\Greph;
use Greph\Ast\AstSearchOptions;
use Greph\Text\TextSearchOptions;
$results = Greph::searchText(
'function',
'src',
new TextSearchOptions(fixedString: true, caseInsensitive: true),
);
foreach ($results as $file) {
foreach ($file->matches as $match) {
echo "{$file->file}:{$match->line}:{$match->content}\n";
}
}
$matches = Greph::searchAst(
'new $CLASS()',
'src',
new AstSearchOptions(),
);
foreach ($matches as $match) {
echo "{$match->file}:{$match->startLine}:{$match->code}\n";
}
La superficie completa è descritta in API.
Ricerca indicizzata
I carichi di lavoro ripetuti traggono vantaggio dagli indici precaricati. Create l'indice una volta, poi eseguite molte query:
# Text index
vendor/bin/greph-index build .
vendor/bin/greph-index search -F "function" .
# AST fact index
vendor/bin/greph-index ast-index build .
vendor/bin/greph-index ast-index search 'new $CLASS()' src
# Cached parsed-tree index
vendor/bin/greph-index ast-cache build .
vendor/bin/greph-index ast-cache search 'array($$$ITEMS)' src
Per impostazione predefinita, gli indici si trovano in .greph-index, .greph-ast-index e .greph-ast-cache nella radice del progetto.
Per alberi che cambiano spesso, scegliete un profilo del ciclo di vita invece di trattare tutti gli indici precaricati allo stesso modo:
vendor/bin/greph-index build . --lifecycle static
vendor/bin/greph-index build . \
--lifecycle opportunistic-refresh \
--auto-refresh-max-files 32 \
--auto-refresh-max-bytes 1048576
vendor/bin/greph-index stats . --dry-refresh
Lo schema comune è:
- mantenere una base stabile come
static - mantenere le sovrapposizioni che cambiano spesso come
opportunistic-refresh - esaminare il comportamento dei dati obsoleti con
stats --dry-refresh
Ricerca precaricata su più indici
Potete cercare in più indici precaricati con un solo comando:
vendor/bin/greph-index search -F "apply_filters" . \
--index-dir wordpress/.greph-index \
--index-dir wp-content/plugins/my-plugin/.greph-index \
--show-index-origin
vendor/bin/greph-index ast-index search 'new $CLASS()' . \
--index-dir wordpress/.greph-ast-index \
--index-dir wp-content/plugins/my-plugin/.greph-ast-index \
--show-index-origin
Gruppi di indici con nome
Se ripetete spesso questa operazione, inserite la struttura in .greph-index-set.json e usate i sottocomandi dei gruppi invece di ripetere i flag:
vendor/bin/greph-index set build
vendor/bin/greph-index set stats --dry-refresh
vendor/bin/greph-index set search --show-index-origin -F "apply_filters" .
vendor/bin/greph-index set search --mode ast-index 'new $CLASS()' .
vendor/bin/greph-index set search --mode ast-cache 'array($$$ITEMS)' .
Traccia del pianificatore
Per vedere come la ricerca precaricata restringe l'insieme dei candidati, aggiungete --trace-plan:
vendor/bin/greph-index search --trace-plan -F "function" .
vendor/bin/greph-index ast-index search --trace-plan 'new $CLASS()' .
Consultate Indicizzato / Testo e Indicizzato / AST per il flusso di lavoro precaricato completo.
Wrapper di compatibilità
Se avete strumenti o agenti che usano già ripgrep o ast-grep, aggiungete i wrapper:
vendor/bin/rg --json -F "function" src
vendor/bin/sg --pattern 'new $CLASS()' src --lang php
Entrambi i wrapper riutilizzano lo stesso motore e sono verificati tramite test rispetto ai binari upstream. Le funzionalità verificate sono documentate in Compatibilità / rg e Compatibilità / sg e riprodotte nella matrice delle funzionalità generata.
Configurazione
Greph riconosce due convenzioni su disco:
.gitignore: rispettato per impostazione predefinita. Passate--no-ignoreper disabilitarlo..grephignore: stessa sintassi di.gitignore, applicata in aggiunta. Utile per esclusioni specifiche dello strumento che non volete includere nel controllo di versione.
Le directory predefinite degli indici sono .greph-index, .greph-ast-index e .greph-ast-cache nella radice scelta. Sovrascrivetele con --index-dir in qualsiasi sottocomando greph-index oppure usate .greph-index-set.json per strutture ripetibili con più indici.