Greph
Tīrs PHP koda meklēšanas, strukturālās meklēšanas un pārrakstīšanas dzinējs. grep, ripgrep un ast-grep darbplūsmas vienā Composer pakotnē.
composer require greph/grephJaunākais laidiens 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)' srcPraksē
Instalējiet pakotni ar Composer, pēc tam meklējiet un pārrakstiet komandrindā vai no PHP.
Meklējiet, atrodiet atbilstības un priekšskatiet pārrakstīšanu
-F veic precīzu teksta meklēšanu, -p pieņem PHP formas rakstu ar metavariabļiem, piemēram, $CLASS, bet -r pievieno aizstāšanas veidni. --dry-run izvada pārrakstītos failus, tos nerakstot diskā.
Statiskā Greph fasāde nodrošina tās pašas darbības arī PHP kodam. Instalējot kā atkarību, vendor/bin komandām nepieciešama versija 0.2.3 vai jaunāka.
# 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(),
);Tīrs PHP
Meklēšana un pārrakstīšana darbojas PHP 8.2+, bez grep, ripgrep vai ast-grep binārajiem failiem. Izmanto json, ctype un tokenizer paplašinājumus, kā arī zlib kešotai AST krātuvei.
Teksta meklēšana
Precīzu virkņu un regulāro izteiksmju meklēšana ar pilna vārda, reģistrjutības ignorēšanas, konteksta, skaita un tikai failu režīmiem. grep saderīga izvade.
AST meklēšana
Strukturālā meklēšana PHP pirmkodā, izmantojot $VAR un $$$VARIADIC metavariabļus, atkārtotus tvērumus un JSON izvadi. Atbalstīta ir tikai valoda PHP.
AST pārveide
Strukturāla pārrakstīšana ar izmēģinājuma, interaktīvo un rakstīšanas režīmu. Mainās tikai atbilstošais kods; komentāri un izkārtojums ārpus atbilstības paliek nemainīti.
Indeksētie režīmi
Vienreiz izveidojiet triagrammu teksta indeksu, AST faktu indeksu vai kešotu AST krātuvi un izmantojiet to atkārtoti. Projekta veiktspējas testā AST faktu indeksa izveide aizņēma 1.4 s un samazināja new $CLASS() no 2.9 s līdz 11 ms; triagrammu indeksa izveide aizņēma 12.3 s.
rg un sg aplauzēji
vendor/bin/rg un vendor/bin/sg vienā dzinējā pieņem biežāk lietotos ripgrep un ast-grep meklēšanas karodziņus. Nav atbalstīts: vairākas rindas, --replace, --type-add un --sort rīkā rg; YAML noteikumi un valodas, kas nav PHP, rīkā sg.
PHP API
Greph::searchText(), searchAst() un rewriteAst() atgriež tipizētus rezultātu objektus, tāpēc PHP kods un aģenti var izsaukt dzinēju bez apakšprocesa.
Oracle korpuss
39 scenārijos greph teksta, AST un pārrakstīšanas izvade tiek salīdzināta ar grep, ripgrep un ast-grep. Palaidiet tos ar composer test:oracle repozitorija klonā; CI palaiž vienību un integrācijas testu kopas.
Kāpēc Greph
Nav vietējo bināro failu
Meklēšana un pārrakstīšana darbojas PHP procesā. rg, grep un sg binārie faili tiek izmantoti tikai izvēles veiktspējas salīdzinājumiem.
Viens dzinējs visiem režīmiem
Teksta meklēšana, PHP strukturālā meklēšana un pārrakstīšana ietilpst vienā Composer pakotnē. rg un sg aplauzēji izsauc to pašu dzinēju, ko izmanto vendor/bin/greph.
Pārrakstīšana skar tikai atbilstības
Pārrakstītājs ievieto attēloto veidni atbilstošajos baitu diapazonos. Kods ārpus atbilstības saglabā atkāpes, komentārus un tukšās rindas.
Iesildīti indeksi bez dēmona
Indeksi atrodas diskā un tiek izmantoti atkārtoti. Dzīves cikla profils nosaka, vai novecojis indekss tiek atstāts nemainīts, atjaunināts meklēšanas laikā vai noraidīts.
Salīdzinājums ar
Greph apvieno meklēšanu un pārrakstīšanu PHP. Šie rīki risina saistītas problēmas, un dažas lietas Greph nepiedāvā.
| Rīks | Piemērots | Atšķirība no Greph |
|---|---|---|
| ripgrep | PiemērotsRekursīvas regulāro izteiksmju meklēšanas rīks ar pirmšķirīgu atbalstu platformās Windows, macOS un Linux, kā arī binārām lejupielādēm katram laidienam. Tas ievēro gitignore noteikumus un pēc noklusējuma izlaiž slēptos un bināros failus. | Atšķirība no GrephGreph instalē ar Composer un darbojas PHP. CI veiktspējas testā ar WordPress korpusu rg bija ātrāks katrā aukstajā teksta vaicājumā, piemēram, burtisku virkņu meklēšana aizņēma 81.62 ms pret 458.82 ms. Iesildīts Greph indekss atbildēja uz skaita vaicājumu 10.90 ms pret rg 49.61 ms. |
| ast-grep | PiemērotsKompilēts CLI strukturālajai meklēšanai, lint pārbaudēm un pārrakstīšanai, veidots uz tree-sitter. Tam ir iebūvēts atbalsts daudzām valodām, tostarp PHP, kā arī YAML noteikumu faili lint pārbaudēm un koda izmaiņām. | Atšķirība no GrephGreph apstrādā tikai PHP un nelasa YAML noteikumus. Aukstajā skenēšanā array($$$ITEMS) bija ātrāks Greph CI veiktspējas testā. Greph iesildītais AST indekss atbildēja uz new $CLASS() vaicājumu 10.89 ms pret 4093.61 ms sg. |
| Rector | PiemērotsAtjaunina un refaktorē PHP kodu, izmantojot noteikumus un noteikumu kopas, aptverot PHP versijas no 5.3 līdz 8.5 un projektus, piemēram, Symfony, PHPUnit un Doctrine. | Atšķirība no GrephGreph pārraksta kodu, izmantojot jūsu veidotu rakstu un veidni. Dokumentācijā norādīts, ka to nevajadzētu izmantot, ja izmaiņas ir atkarīgas no tipa informācijas, ko PHP-Parser nevar noteikt, analizējot vienu failu, vai ja jāveic importu pievienošana vai noņemšana starp failiem. |
| PHP CS Fixer | PiemērotsPielāgo kodu kodēšanas standartiem, izmantojot iebūvētas noteikumu kopas, piemēram, PHP-FIG's PER kodēšanas stilu. | Atšķirība no GrephGreph nepārformatē failus. Tas maina tikai raksta atrasto kodu, un dokumentācijā norādīts izmantot PHP CS Fixer, ja nepieciešams formatētājs. |
Jautājumi un atbildes
Īsas atbildes no Greph dokumentācijas.
Nē. Greph veic meklēšanu un pārrakstīšanu PHP. Ārējie rg, grep un sg binārie faili tiek izmantoti tikai izvēles veiktspējas salīdzinājumiem.
Tikai PHP. Raksti un pirmkoda faili tiek parsēti ar nikic/php-parser, un jebkura cita --lang vērtība tiek noraidīta kā neatbalstīta.
Aukstajās skenēšanās — nē. Projekta CI veiktspējas testā ar WordPress korpusu rg un grep bija ātrāki katrā aukstajā teksta vaicājumā. Iesildīti indeksi palīdz atkārtotos vaicājumos, piemēram, indeksēta skaita vaicājums aizņēma 10.90 ms pret rg 49.61 ms.
Greph darbojas viena procesa režīmā. Bez pcntl_fork darbplūsmu kopa apstrādā katru daļu tajā pašā procesā, iegūstot tādu pašu rezultātu kā ar -j 1, un nerada kļūdu.
Ārpus atbilstības — nē. Kods ārpus atbilstošajiem baitu diapazoniem saglabā atstarpes, komentārus un izkārtojumu. Atbilstošais kods tiek izdrukāts no jauna, izmantojot veidni, tāpēc tā rindas pārtraukumi tiek normalizēti un tajā esošs komentārs var tikt pazaudēts. Vispirms palaidiet ar --dry-run, lai izvadītu pārrakstītos failus, tos nerakstot diskā.
Pēc noklusējuma mapēs .greph-index, .greph-ast-index un .greph-ast-cache indeksētās saknes direktorijā. Izmantojiet --index-dir ar jebkuru greph-index apakškomandu, lai norādītu citu atrašanās vietu.
Lasiet Greph dokumentāciju, lai uzzinātu par CLI atsauci, PHP API, indeksētajiem režīmiem un rg un sg aplauzējiem.