Greph
Αμιγής αναζήτηση κώδικα PHP, δομική αναζήτηση και μηχανή αναδιαγραφής. Ροές εργασίας grep, ripgrep και ast-grep σε ένα πακέτο Composer.
composer require greph/grephΤελευταία έκδοση 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)' srcΣτην πράξη
Εγκαταστήστε το πακέτο με το Composer και, στη συνέχεια, αναζητήστε και αναδιαγράψτε από τη γραμμή εντολών ή από το PHP.
Αναζητήστε, αντιστοιχίστε και δείτε προεπισκόπηση αναδιαγραφής
Το -F εκτελεί αναζήτηση κειμένου σταθερής συμβολοσειράς, το -p δέχεται μοτίβο τύπου PHP με μεταβλητές μεταδεδομένων όπως το $CLASS, και το -r προσθέτει ένα πρότυπο αντικατάστασης. Το --dry-run εμφανίζει τα αναδιαγραμμένα αρχεία χωρίς να τα γράφει.
Η στατική πρόσοψη Greph παρέχει τις ίδιες λειτουργίες σε κώδικα PHP. Όταν εγκαθίστανται ως εξάρτηση, οι εντολές vendor/bin απαιτούν την έκδοση 0.2.3 ή νεότερη.
# 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(),
);Αμιγές PHP
Η αναζήτηση και η αναδιαγραφή εκτελούνται σε PHP 8.2+, χωρίς δυαδικά αρχεία grep, ripgrep ή ast-grep. Χρησιμοποιεί τις επεκτάσεις json, ctype και tokenizer, καθώς και zlib για την προσωρινά αποθηκευμένη συλλογή AST.
Αναζήτηση κειμένου
Αναζήτηση σταθερής συμβολοσειράς και regex με λειτουργίες ολόκληρης λέξης, χωρίς διάκριση πεζών-κεφαλαίων, πλαισίου, μέτρησης και μόνο για αρχεία. Έξοδος συμβατή με το grep.
Αναζήτηση AST
Δομική αναζήτηση σε πηγαίο κώδικα PHP με $VAR και μεταβλητές μεταδεδομένων $$$VARIADIC, επαναλαμβανόμενες καταγραφές και έξοδο JSON. Υποστηρίζεται μόνο η γλώσσα PHP.
Επανεγγραφή AST
Δομικές αναδιαγραφές με λειτουργίες δοκιμαστικής εκτέλεσης, διαδραστικής χρήσης και εγγραφής. Αλλάζει μόνο ο κώδικας που αντιστοιχίστηκε· τα σχόλια και η διάταξη εκτός αντιστοίχισης παραμένουν ως είχαν.
Λειτουργίες με ευρετήριο
Δημιουργήστε μία φορά ευρετήριο τριγράμματων, ευρετήριο στοιχείων AST ή αποθηκευμένη συλλογή AST και επαναχρησιμοποιήστε το. Στη δοκιμή επιδόσεων του έργου, η δημιουργία του ευρετηρίου στοιχείων AST χρειάστηκε 1,4 s και μείωσε το new $CLASS() από 2,9 s σε 11 ms· το ευρετήριο τριγράμματων χρειάστηκε 12,3 s.
Περιτυλίγματα rg & sg
Τα vendor/bin/rg και vendor/bin/sg δέχονται τις κοινές σημαίες αναζήτησης ripgrep και ast-grep στην ίδια μηχανή. Δεν καλύπτονται: multiline, --replace, --type-add και --sort στο rg· κανόνες YAML και γλώσσες εκτός PHP στο sg.
PHP API
Τα Greph::searchText(), searchAst() και rewriteAst() επιστρέφουν τυποποιημένα αντικείμενα αποτελεσμάτων, ώστε κώδικας PHP και πράκτορες να καλούν τη μηχανή χωρίς υποδιεργασία.
Σώμα δοκιμών αναφοράς
39 σενάρια συγκρίνουν με diff την έξοδο κειμένου, AST και αναδιαγραφής του greph με εκείνη των grep, ripgrep και ast-grep. Εκτελέστε τα με composer test:oracle σε ένα αντίγραφο του αποθετηρίου· το CI εκτελεί τις σουίτες μονάδων και ενσωμάτωσης.
Γιατί Greph
Χωρίς εγγενή δυαδικά αρχεία
Η αναζήτηση και η αναδιαγραφή εκτελούνται μέσα στη διεργασία PHP. Τα δυαδικά αρχεία rg, grep και sg χρησιμοποιούνται μόνο για τις προαιρετικές συγκρίσεις επιδόσεων.
Μία μηχανή για κάθε λειτουργία
Η αναζήτηση κειμένου, η δομική αναζήτηση PHP και η αναδιαγραφή βρίσκονται σε ένα πακέτο Composer. Τα περιτυλίγματα rg και sg καλούν την ίδια μηχανή με το vendor/bin/greph.
Οι αναδιαγραφές αγγίζουν μόνο τις αντιστοιχίες
Ο αναδιαγραφέας παρεμβάλλει το αποδοσμένο πρότυπο στα εύρη byte που αντιστοιχίστηκαν. Ο κώδικας εκτός αντιστοιχίας διατηρεί τις εσοχές, τα σχόλια και τις κενές γραμμές του.
Θερμά ευρετήρια χωρίς δαίμονα
Τα ευρετήρια αποθηκεύονται στον δίσκο και επαναχρησιμοποιούνται σε επόμενες εκτελέσεις. Ένα προφίλ κύκλου ζωής ορίζει αν ένα παρωχημένο ευρετήριο θα μείνει ως έχει, θα ανανεωθεί κατά την αναζήτηση ή θα απορριφθεί.
Σε σύγκριση με
Το Greph διατηρεί την αναζήτηση και την αναδιαγραφή στο PHP. Αυτά τα εργαλεία επιλύουν συναφή προβλήματα και ορισμένα πράγματα που δεν κάνει το Greph.
| Εργαλείο | Κατάλληλο για | Διαφορά με το Greph |
|---|---|---|
| ripgrep | Κατάλληλο γιαΕργαλείο αναδρομικής αναζήτησης regex με εγγενή υποστήριξη για Windows, macOS και Linux και δυαδικά αρχεία προς λήψη για κάθε έκδοση. Τηρεί τους κανόνες gitignore και παραλείπει από προεπιλογή τα κρυφά και δυαδικά αρχεία. | Διαφορά με το GrephΤο Greph εγκαθίσταται με το Composer και εκτελείται σε PHP. Στη δοκιμή επιδόσεων CI στο σώμα WordPress, το rg ήταν ταχύτερο σε κάθε ψυχρό ερώτημα κειμένου, για παράδειγμα 81,62 ms έναντι 458.82 ms σε αναζήτηση κυριολεκτικής συμβολοσειράς. Ένα θερμό ευρετήριο Greph απάντησε σε ερώτημα μέτρησης σε 10,90 ms έναντι 49,61 ms του rg. |
| ast-grep | Κατάλληλο γιαΜεταγλωττισμένο CLI για δομική αναζήτηση, lint και αναδιαγραφή, βασισμένο στο tree-sitter. Διαθέτει ενσωματωμένη υποστήριξη για πολλές γλώσσες, μεταξύ των οποίων την PHP, και αρχεία κανόνων YAML για κανόνες lint και αλλαγές κώδικα. | Διαφορά με το GrephΤο Greph χειρίζεται μόνο το PHP και δεν διαβάζει κανόνες YAML. Σε ψυχρή σάρωση, το sg ήταν ταχύτερο για το array($$$ITEMS) στη δοκιμή επιδόσεων CI του Greph. Το θερμό ευρετήριο AST του Greph απάντησε στο new $CLASS() σε 10,89 ms έναντι 4093.61 ms του sg. |
| Rector | Κατάλληλο γιαΑναβαθμίζει και αναδιαμορφώνει κώδικα PHP μέσω κανόνων και συνόλων κανόνων, καλύπτοντας εκδόσεις PHP από την 5.3 έως την 8.5 και έργα όπως τα Symfony, PHPUnit και Doctrine. | Διαφορά με το GrephΤο Greph κάνει αναδιαγραφές με βάση ένα μοτίβο και ένα πρότυπο που συντάσσετε. Η τεκμηρίωσή του δεν το συνιστά όταν μια αλλαγή εξαρτάται από πληροφορίες τύπων που το PHP-Parser δεν μπορεί να επιλύσει από ένα μόνο αρχείο ή όταν απαιτείται προσθήκη ή αφαίρεση εισαγωγών μεταξύ αρχείων. |
| PHP CS Fixer | Κατάλληλο γιαΔιορθώνει τον κώδικα ώστε να ακολουθεί πρότυπα κωδικοποίησης, με ενσωματωμένα σύνολα κανόνων όπως το PER Coding Style του PHP-FIG. | Διαφορά με το GrephΤο Greph δεν αναμορφοποιεί αρχεία. Αλλάζει μόνο τον κώδικα που αντιστοιχίστηκε με ένα μοτίβο και η τεκμηρίωσή του προτείνει το PHP CS Fixer όταν θέλετε μορφοποιητή. |
Πηγές, επιλεγμένο
Ερωτήσεις και απαντήσεις
Σύντομες απαντήσεις από την τεκμηρίωση του Greph.
Όχι. Το Greph εκτελεί αναζήτηση και αναδιαγραφή στο PHP. Τα εξωτερικά δυαδικά αρχεία rg, grep και sg χρησιμοποιούνται μόνο για τις προαιρετικές συγκρίσεις επιδόσεων.
Μόνο την PHP. Τα μοτίβα και τα αρχεία πηγαίου κώδικα αναλύονται με το nikic/php-parser, ενώ οποιαδήποτε άλλη τιμή --lang απορρίπτεται ως μη υποστηριζόμενη.
Όχι σε ψυχρές σαρώσεις. Στη δοκιμή επιδόσεων CI του έργου στο σώμα WordPress, τα rg και grep ήταν ταχύτερα σε κάθε ψυχρό ερώτημα κειμένου. Τα θερμά ευρετήρια βοηθούν σε επαναλαμβανόμενα ερωτήματα, για παράδειγμα 10,90 ms έναντι 49,61 ms του rg σε καταμέτρηση με ευρετήριο.
Το Greph εκτελείται σε μία διεργασία. Χωρίς το pcntl_fork, η δεξαμενή εργατών εκτελεί κάθε τμήμα εντός της διεργασίας, με το ίδιο αποτέλεσμα όπως το -j 1, και δεν προκαλεί σφάλμα.
Όχι έξω από μια αντιστοιχία. Ο κώδικας εκτός των εύρων byte που αντιστοιχίστηκαν διατηρεί τα κενά, τα σχόλια και τη διάταξή του. Ο κώδικας που αντιστοιχίστηκε εκτυπώνεται ξανά από το πρότυπο, επομένως οι αλλαγές γραμμής κανονικοποιούνται και μπορεί να χαθεί ένα σχόλιο που βρίσκεται μέσα του. Εκτελέστε πρώτα την εντολή με --dry-run για να εμφανίσετε τα αναδιαγραμμένα αρχεία χωρίς να τα γράψετε.
Από προεπιλογή, στους φακέλους .greph-index, .greph-ast-index και .greph-ast-cache στη ρίζα όπου δημιουργήθηκε το ευρετήριο. Περάστε το --index-dir σε οποιαδήποτε υποεντολή greph-index για να χρησιμοποιήσετε άλλη τοποθεσία.
Διαβάστε την τεκμηρίωση του Greph για την αναφορά CLI, το PHP API, τις λειτουργίες με ευρετήριο και τα περιτυλίγματα rg και sg.