Začetek
Namestitev
Namestite Greph prek Composer:
composer require greph/greph
S tem namestite knjižnico in štiri izvršne datoteke v vendor/bin/:
greph: iskanje po besedilu, iskanje po AST in prepis ASTgreph-index: ogret besedilni indeks, indeks dejstev AST in predpomnjeno iskanje po ASTrg: ovojnica za združljivost v slogu ripgrepsg: ovojnica za združljivost v slogu ast-grep
Te izvršne datoteke delujejo iz vendor/bin/ vašega projekta, saj Greph 0.2.3. Starejše izdaje so nalagalnik Composer našle le znotraj klona repozitorija Greph, zato uporabite vsaj to različico:
composer require greph/greph:^0.2.3
Zahteve
- PHP 8.2+ za razrede samo za branje, naštevanja, sintakso klicevnih izrazov prvega razreda in promocijo konstruktorjev
- ext-json za izhod JSON in podatke koristnega tovora indeksov na disku
- ext-ctype za razčlenjevanje vzorcev in možnosti
- ext-tokenizer za PHP-Parser in predfiltre AST
- ext-zlib za shrambo predpomnjenega AST (
greph-index ast-cache) - nikic/php-parser (samodejno nameščen kot odvisnost Composer)
ext-json, ext-ctype in ext-tokenizer so omogočeni v skoraj vsaki gradnji PHP. composer.json trenutno navaja samo ext-json (#5), zato Composer ne opozori, če kateri od drugih manjka.
Izbirno:
- ext-pcntl za vzporedna pregledovanja. Greph ob njegovi odsotnosti nemoteno preklopi na izvajanje v enem procesu.
- Zunanje binarne datoteke
rg,grepinsgza primerjave zmogljivosti. Za izvajanje nikoli niso potrebne.
Iskanje, prepisovanje in indeksiranje nikoli ne kličejo proc_open() ali shell_exec(); samo vzporedna pregledovanja ustvarijo podrejene procese, brez pcntl_fork() pa se vrnejo na en sam proces. Za gostitelje, ki onemogočajo proc_open(), shell_exec() ali pcntl_fork(), glejte Gostitelji z omejenimi procesi.
Vaše prvo iskanje po besedilu
Privzeti način Greph je iskanje po besedilu, združljivo z grep:
vendor/bin/greph -F "function" src
Izhod uporablja kanonično obliko file:line:content, ki jo pričakujejo grep, ripgrep in večina integracij urejevalnikov.
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(
Dodajte -i za ujemanje brez razlikovanja med velikimi in malimi črkami, -w za ujemanje celih besed, -c za štetje, -l samo za poti datotek, -C 2 za dve vrstici konteksta in tako naprej. Celoten seznam je v referenci CLI.
Vaše prvo iskanje po AST
Podajte -p in vzorec v obliki PHP, da preklopite na strukturno iskanje:
vendor/bin/greph -p 'new $CLASS()' src
$CLASS je metaspremenljivka, ki zajame poljubno ime razreda. Vzorec new $CLASS() ustreza vsakemu izrazu new brez argumentov, ne glede na razred, oblikovanje ali komentarje. Za ujemanje klicev s poljubnimi argumenti uporabite new $CLASS($$$ARGS).
Vsako ujemanje AST je izpisano kot datoteka, začetna vrstica in ujemajoča se koda:
src/Greph.php:43:new FileWalker()
src/Greph.php:52:new TextSearchOptions()
src/Greph.php:54:new TextSearcher()
Drugi uporabni vzorci:
# 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
Za celotno sintakso vzorcev glejte Načini / iskanje AST.
Vaš prvi prepis
Dodajte -r, da iskanje AST spremenite v prepis:
# 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
Pri prepisih se oblikovanje zunaj ujemanja ohrani: zamenja se samo ujemajoče se vozlišče, okoliški presledki, zamiki in komentarji pa ostanejo nedotaknjeni. Ujemajoče se vozlišče se na novo izpiše iz predloge, zato se njegova lastna postavitev poenoti, komentar v njem pa se lahko izgubi. Več podrobnosti najdete v Načini / prepis.
PHP API
Statični fasadni vmesnik Greph\Greph izpostavlja enake operacije kot 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";
}
Celoten nabor je opisan v API.
Indeksirano iskanje
Pri ponavljajočih se opravilih pomagajo ogreti indeksi. Zgradite jih enkrat, nato poizvedujte večkrat:
# 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
Indeksi so privzeto shranjeni v .greph-index, .greph-ast-index in .greph-ast-cache v korenski mapi projekta.
Pri drevesih, ki se aktivno spreminjajo, izberite profil življenjskega cikla, namesto da bi vse ogrete indekse obravnavali enako:
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
Običajen vzorec je:
- ohranite stabilno osnovo kot
static - ohranite aktivno spreminjajoče se nadgradnje kot
opportunistic-refresh - vedenje zastarelih indeksov preverjajte z
stats --dry-refresh
Iskanje v več ogretih indeksih
V enem ukazu lahko iščete po več ogretih indeksih:
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
Poimenovani nabori indeksov
Če to počnete večkrat, shranite razporeditev v .greph-index-set.json in uporabite podukaze za nabore, namesto da ponavljate zastavice:
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)' .
Sled načrtovalnika
Če želite videti, kako ogreto iskanje zoži nabor kandidatov, dodajte --trace-plan:
vendor/bin/greph-index search --trace-plan -F "function" .
vendor/bin/greph-index ast-index search --trace-plan 'new $CLASS()' .
Za celoten potek dela z ogretimi indeksi glejte Indeksirano / besedilo in Indeksirano / AST.
Ovojnice za združljivost
Če vaša orodja ali agenti že uporabljajo ripgrep ali ast-grep, preprosto uporabite ovojnice:
vendor/bin/rg --json -F "function" src
vendor/bin/sg --pattern 'new $CLASS()' src --lang php
Obe ovojnici znova uporabljata isti mehanizem in sta preverjeni s preizkusnimi ukazi glede na izvorni binarni datoteki. Preverjeni nabor je dokumentiran v Združljivost / rg in Združljivost / sg ter ponovljen v ustvarjeni matriki funkcij.
Konfiguracija
Greph upošteva dve dogovorni ureditvi na disku:
.gitignore: privzeto se upošteva. Podajte--no-ignore, če želite to izklopiti..grephignore: enaka sintaksa kot pri.gitignore, uporabljena dodatno. Uporabno za izključitve, specifične za orodje, ki jih ne želite vključiti v nadzor različic.
Privzeti imeniki indeksov so .greph-index, .greph-ast-index in .greph-ast-cache v izbrani korenski mapi. Preglasite jih z --index-dir pri katerem koli podukazu greph-index ali uporabite .greph-index-set.json za ponovljive razporeditve z več indeksi.