Greph
Mesin pencarian kode PHP murni, pencarian struktural, dan penulisan ulang. Alur kerja grep, ripgrep, dan ast-grep dalam satu paket Composer.
composer require greph/grephRilis terbaru 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)' srcDalam praktik
Pasang paket dengan Composer, lalu cari dan tulis ulang dari baris perintah atau dari PHP.
Cari, cocokkan, dan pratinjau penulisan ulang
-F menjalankan pencarian teks string tetap, -p menerima pola berbentuk PHP dengan variabel meta seperti $CLASS, dan -r menambahkan templat pengganti. --dry-run mencetak file yang telah ditulis ulang tanpa menyimpannya.
Facade Greph statis menyediakan operasi yang sama untuk kode PHP. Jika dipasang sebagai dependensi, perintah vendor/bin memerlukan versi 0.2.3 atau lebih baru.
# 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 Murni
Pencarian dan penulisan ulang berjalan di PHP 8.2+, tanpa biner grep, ripgrep, atau ast-grep. Menggunakan ekstensi json, ctype, dan tokenizer, serta zlib untuk penyimpanan AST cache.
Pencarian Teks
Pencarian string tetap dan regex dengan mode kata utuh, tidak peka huruf besar-kecil, konteks, jumlah, dan khusus file. Keluaran kompatibel dengan grep.
Pencarian AST
Pencarian struktural pada kode sumber PHP dengan variabel meta $VAR dan $$$VARIADIC, capture berulang, dan keluaran JSON. PHP adalah satu-satunya bahasa yang didukung.
Penulisan Ulang AST
Penulisan ulang struktural dengan mode dry-run, interaktif, dan tulis. Hanya kode yang cocok yang berubah; komentar dan tata letak di luar kecocokan tetap seperti semula.
Mode Terindeks
Bangun indeks teks trigram, indeks fakta AST, atau penyimpanan AST cache sekali, lalu gunakan kembali. Dalam benchmark proyek, indeks fakta AST membutuhkan 1.4 s untuk dibuat dan memangkas new $CLASS() dari 2.9 s menjadi 11 ms; indeks trigram membutuhkan 12.3 s.
Wrapper rg & sg
vendor/bin/rg dan vendor/bin/sg menerima flag pencarian umum ripgrep dan ast-grep pada mesin yang sama. Tidak tercakup: multiline, --replace, --type-add, dan --sort di rg; aturan YAML dan bahasa non-PHP di sg.
PHP API
Greph::searchText(), searchAst(), dan rewriteAst() mengembalikan objek hasil bertipe, sehingga kode PHP dan agen dapat memanggil mesin tanpa subprocess.
Korpus Oracle
39 skenario membandingkan output teks greph, AST, dan penulisan ulang dengan grep, ripgrep, dan ast-grep. Jalankan dengan composer test:oracle dalam klon repositori; CI menjalankan rangkaian unit dan integrasi.
Mengapa Greph
Tanpa Biner Native
Pencarian dan penulisan ulang berjalan di dalam proses PHP. Biner rg, grep, dan sg hanya digunakan untuk perbandingan benchmark opsional.
Satu Mesin untuk Setiap Mode
Pencarian teks, pencarian dan penulisan ulang struktural PHP berada dalam satu paket Composer. Wrapper rg dan sg memanggil mesin yang sama dengan vendor/bin/greph.
Penulisan ulang hanya mengubah bagian yang cocok
Penulis ulang menyisipkan templat yang dirender ke dalam rentang byte yang cocok. Kode di luar kecocokan mempertahankan indentasi, komentar, dan baris kosongnya.
Indeks Hangat Tanpa Daemon
Indeks disimpan di disk dan digunakan kembali pada proses berikutnya. Profil siklus hidup menentukan apakah indeks usang dibiarkan, diperbarui saat pencarian, atau ditolak.
Dibandingkan dengan
Greph menyatukan pencarian dan penulisan ulang dalam PHP. Alat-alat ini menyelesaikan masalah terkait dan melakukan beberapa hal yang tidak dilakukan Greph.
| Alat | Keunggulan | Perbedaan dengan Greph |
|---|---|---|
| ripgrep | KeunggulanAlat pencarian regex rekursif dengan dukungan kelas satu di Windows, macOS, dan Linux serta unduhan biner untuk setiap rilis. Alat ini mematuhi aturan gitignore dan secara default melewati file tersembunyi serta biner. | Perbedaan dengan GrephGreph dipasang dengan Composer dan berjalan di PHP. Dalam benchmark CI pada korpus WordPress, rg lebih cepat pada setiap kueri teks tanpa cache; misalnya, 81.62 ms dibanding 458.82 ms untuk pencarian literal. Indeks Greph yang hangat menjawab kueri jumlah dalam 10.90 ms dibanding 49.61 ms untuk rg. |
| ast-grep | KeunggulanCLI terkompilasi untuk pencarian struktural, lint, dan penulisan ulang, dibangun di atas tree-sitter. Mendukung banyak bahasa secara bawaan, termasuk PHP, serta file aturan YAML untuk aturan lint dan perubahan kode. | Perbedaan dengan GrephGreph hanya menangani PHP dan tidak membaca aturan YAML. Pada pemindaian tanpa cache, sg lebih cepat untuk array($$$ITEMS) dalam benchmark CI milik Greph. Indeks AST hangat milik Greph menjawab new $CLASS() dalam 10.89 ms dibanding 4093.61 ms untuk sg. |
| Rector | KeunggulanMemutakhirkan dan merefaktor kode PHP melalui aturan dan kumpulan aturan, mencakup versi PHP dari 5.3 hingga 8.5 serta proyek seperti Symfony, PHPUnit, dan Doctrine. | Perbedaan dengan GrephGreph menulis ulang berdasarkan pola dan templat yang Anda buat. Dokumentasinya menyarankan untuk tidak menggunakannya ketika perubahan bergantung pada informasi tipe yang tidak dapat diselesaikan PHP-Parser dari satu file, atau memerlukan penambahan atau penghapusan import lintas file. |
| PHP CS Fixer | KeunggulanMemperbaiki kode agar mengikuti standar pengodean, dengan kumpulan aturan bawaan seperti Gaya Pengodean PER dari PHP-FIG. | Perbedaan dengan GrephGreph tidak memformat ulang file. Alat ini hanya mengubah kode yang cocok dengan pola, dan dokumentasinya mengarahkan Anda ke PHP CS Fixer jika menginginkan pemformat. |
Sumber, dicentang
Tanya jawab
Jawaban singkat dari dokumentasi Greph.
Tidak. Greph menjalankan pencarian dan penulisan ulang di PHP. Biner eksternal rg, grep, dan sg hanya digunakan untuk perbandingan benchmark opsional.
Hanya PHP. Pola dan file sumber diurai dengan nikic/php-parser, dan nilai --lang lainnya ditolak karena tidak didukung.
Tidak pada pemindaian tanpa cache. Dalam benchmark CI proyek pada korpus WordPress, rg dan grep lebih cepat pada setiap kueri teks tanpa cache. Indeks hangat membantu kueri berulang, misalnya 10.90 ms dibanding 49.61 ms untuk rg pada kueri jumlah terindeks.
Greph berjalan sebagai satu proses. Tanpa pcntl_fork, kumpulan worker menjalankan setiap potongan dalam proses yang sama, dengan hasil yang sama seperti -j 1, dan tidak memunculkan error.
Di luar bagian yang cocok, tidak. Kode di luar rentang byte yang cocok mempertahankan spasi kosong, komentar, dan tata letaknya. Kode yang cocok dicetak ulang dari templat, sehingga baris baru dinormalisasi dan komentar di dalamnya dapat hilang. Jalankan dengan --dry-run terlebih dahulu untuk mencetak file yang telah ditulis ulang tanpa menyimpannya.
Secara default, di .greph-index, .greph-ast-index, dan .greph-ast-cache pada root yang diindeks. Berikan --index-dir ke subperintah greph-index mana pun untuk menggunakan lokasi lain.
Baca dokumentasi Greph untuk referensi CLI, PHP API, mode terindeks, serta wrapper rg dan sg.