İçeriğe geç

Giriş

Greph, kaynak ağaçları için saf PHP arama ve yeniden düzenleme motorudur. Birbiriyle ilişkili üç kipi kapsar:

  • Metin arama: grep uyumlu çıktı ve ripgrep tarzı kullanım kolaylığı.
  • AST arama: PHP yapısal desenler ve üst değişkenler.
  • AST yeniden yazma: biçimi koruyan yapısal yeniden düzenleme.

Metin ve AST iş yükleri için ısıtılmış dizinli kipler, yaşam döngüsünü dikkate alan yenileme ilkeleri, bildirim temelli ısıtılmış dizin kümeleri ve araç ve ajan ortamları için rg / sg uyumluluk sarmalayıcıları da sunar.

Greph neden var?

Hızlı kod araması gereken PHP uygulamaları ve ajanları genellikle yerel araçları (grep, ripgrep, ast-grep) kabuk üzerinden çalıştırır; bu da taşınabilirlikten ödün vermelerine ve dağıtım sürecinin zorlaşmasına yol açar. Yapısal arama ve yeniden yazma daha da zordur: genellikle PHP sürecinden tamamen çıkmayı gerektirir.

Greph bu boşluğu kapatır. PHP kodunuz, yalnızca standart kitaplığı ve nikic/php-parser kullanarak metin aramaları, yapısal eşleşmeler ve yeniden düzenleme amaçlı yeniden yazmalar gerçekleştirebilir. Çıktı ve çıkış kodları standart araçlarla uyumludur; dolayısıyla mevcut betik ve ajanlarınızı değiştirmeniz gerekmez.

Ne yapar?

  • Tam dizge ve regex metin araması; tam sözcük, büyük/küçük harf duyarsızlığı, bağlam, sayım ve yalnızca dosya modlarıyla
  • PHP ile yapısal AST araması; $VAR, $$$VARIADIC ve yinelenen metadeğişkenlerle
  • Deneme çalıştırması, etkileşimli ve yazma modlarıyla biçimi koruyan AST yeniden yazımı
  • Yinelenen iş yükleri için ısıtılmış metin dizinleri (trigram + tanımlayıcı gönderimleri)
  • Yinelenen yapısal sorgular için ısıtılmış AST olgu dizini ve önbelleğe alınmış AST araması
  • Yaşam döngüsünü dikkate alan ısıtılmış dizinler: static, manual-refresh, opportunistic-refresh, strict-stale-check
  • Isıtılmış metin, AST olgu ve AST önbelleği depolarında çoklu dizin ve adlandırılmış küme araması
  • Isıtılmış aramalar için --trace-plan ile planlayıcı tanılamaları ve dizin kaynağı etiketlemesi
  • Aynı altyapıyı kullanan ripgrep ve ast-grep CLI uyumluluk sarmalayıcıları
  • Tek süreçli yedek seçeneği bulunan pcntl tabanlı paralel çalışan havuzu
  • İkili dosya algılamalı, gitignore ve .grephignore kurallarını dikkate alan dosya gezgini

Gereksinimler

  • PHP 8.2 veya üzeri
  • Hemen hemen her PHP derlemesinde etkin olan ext-json, ext-ctype ve ext-tokenizer
  • Önbelleğe alınmış AST deposu (greph-index ast-cache) için ext-zlib
  • Tek Composer bağımlılığı olan nikic/php-parser

Temel metin ve AST özellikleri saf PHP ile çalışır. İsteğe bağlı kıyaslama karşılaştırmaları rg, grep ve sg gibi harici araçlara bağlıdır; ancak Greph, çalışmak için bunları gerektirmez. Paralel taramalar, kullanılabilir olduğunda ext-pcntl kullanır; aksi durumda sorunsuz biçimde tek süreçli çalışmaya geçer. proc_open() ve shell_exec() kullanımını yasaklayan barındırma ortamları Süreci Kısıtlı Barındırma Ortamları bölümünde ele alınır.

Hızlı örnek

Greph projenizin bir bağımlılığı olarak kurulduğunda, vendor/bin çalıştırılabilir dosyaları için Greph 0.2.3 veya üzeri gerekir.

Kabuk
# 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 src
PHP
use 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(),
);

$rewrites = Greph::rewriteAst(
    'array($$$ITEMS)',
    '[$$$ITEMS]',
    'src',
);

Önce Başlarken bölümünü inceleyin; ardından kapsamın geri kalanı için CLI ve API bölümlerini kullanın. Modlar, Dizinlenmiş ve Uyumluluk bölümlerinde belirli iş akışları ayrıntılı olarak ele alınır.