본문으로 건너뛰기

Greph

순수 PHP 코드 검색, 구조 검색 및 재작성 엔진입니다. grep, ripgrep 및 ast-grep 워크플로우를 하나의 Composer 패키지로 제공합니다.

터미널
composer require greph/greph

최신 릴리스 v0.2.3 MIT PHP 8.2+

실제 사용

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 src

순수 PHP

검색과 재작성은 grep, ripgrep 또는 ast-grep 바이너리 없이 PHP 8.2+에서 실행됩니다. json, ctype 및 tokenizer 확장과 캐시된 AST 저장소용 zlib를 사용합니다.

텍스트 검색

고정 문자열 및 정규식 검색에 단어 전체 일치, 대소문자 구분 없는 검색, 컨텍스트, 개수 및 파일 전용 모드를 지원합니다. 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 검색 플래그를 지원합니다. 지원하지 않는 항목: rg의 멀티라인, --replace, --type-add 및 --sort, sg의 YAML 규칙 및 비-PHP 언어.

PHP API

Greph::searchText(), searchAst() 및 rewriteAst()는 타입이 지정된 결과 객체를 반환하므로 PHP 코드와 에이전트가 하위 프로세스 없이 엔진을 호출할 수 있습니다.

오라클 코퍼스

39개 시나리오에서 greph의 텍스트, AST 및 재작성 출력을 grep, ripgrep 및 ast-grep과 비교합니다. 저장소를 복제한 뒤 composer test:oracle로 실행하세요. CI에서는 단위 및 통합 테스트 모음을 실행합니다.

Greph를 사용하는 이유

네이티브 바이너리 없음

검색과 재작성은 PHP 프로세스 내부에서 실행됩니다. rg, grep 및 sg 바이너리는 선택적 벤치마크 비교에만 사용됩니다.

모든 모드를 위한 하나의 엔진

텍스트 검색, PHP 구조 검색 및 재작성이 하나의 Composer 패키지에 포함됩니다. rg 및 sg 래퍼는 vendor/bin/greph와 동일한 엔진을 호출합니다.

매치된 부분만 재작성

재작성기는 렌더링된 템플릿을 매치된 바이트 범위에 삽입합니다. 매치 밖의 코드는 들여쓰기, 주석 및 빈 줄을 유지합니다.

데몬 없이 인덱스 재사용

인덱스는 디스크에 저장되어 실행 간 재사용됩니다. 수명 주기 프로필에 따라 오래된 인덱스를 그대로 두거나, 검색 중 새로 고치거나, 사용을 거부합니다.

비교 대상

Greph는 검색과 재작성을 PHP 안에서 처리합니다. 이 도구들은 관련 문제를 해결하며 Greph가 하지 않는 작업도 일부 수행합니다.

Greph와 다른 도구 비교
ripgrep 잘하는 점재귀 정규식 검색 도구로, Windows, macOS 및 Linux에서 처음부터 지원되며 모든 릴리스의 바이너리를 다운로드할 수 있습니다. 기본적으로 gitignore 규칙을 따르고 숨김 파일과 바이너리 파일을 건너뜁니다. Greph와의 차이점Greph는 Composer로 설치하고 PHP에서 실행합니다. WordPress 코퍼스에 대한 CI 벤치마크에서 rg는 모든 콜드 텍스트 쿼리에서 더 빨랐습니다. 예를 들어 리터럴 검색은 458.82 ms와 비교해 81.62 ms였습니다. 워밍업된 Greph 인덱스는 개수 쿼리에 49.61 ms가 걸린 rg보다 빠른 10.90 ms에 답했습니다.
ast-grep 잘하는 점tree-sitter를 기반으로 구조 검색, 린트 및 재작성을 수행하는 컴파일된 CLI입니다. PHP를 포함한 여러 언어를 기본 지원하며 린트 규칙과 코드 변경을 위한 YAML 규칙 파일도 제공합니다. Greph와의 차이점Greph는 PHP만 처리하며 YAML 규칙은 읽지 않습니다. 프로젝트 CI 벤치마크의 콜드 검색에서 Greph의 array($$$ITEMS)에는 sg가 더 빨랐습니다. Greph의 워밍업된 AST 인덱스는 new $CLASS()에 10.89 ms 만에 답했으며 sg는 4093.61 ms가 걸렸습니다.
Rector 잘하는 점규칙과 규칙 세트를 통해 PHP 코드를 업그레이드하고 리팩터링합니다. 5.3부터 8.5까지의 PHP 버전과 Symfony, PHPUnit 및 Doctrine 같은 프로젝트를 지원합니다. Greph와의 차이점Greph는 직접 작성한 패턴과 템플릿을 바탕으로 재작성합니다. 설명서에 따르면 단일 파일에서 PHP-Parser가 확인할 수 없는 형식 정보에 변경이 의존하거나 파일 간 가져오기를 추가 또는 제거해야 하는 경우에는 적합하지 않습니다.
PHP CS Fixer 잘하는 점코딩 표준을 따르도록 코드를 수정하며 PHP-FIG의 PER 코딩 스타일 같은 규칙 세트를 기본 제공합니다. Greph와의 차이점Greph는 파일을 다시 포맷하지 않습니다. 패턴과 매치된 코드만 변경하며 포매터가 필요할 때는 PHP CS Fixer를 사용하도록 설명서에서 안내합니다.

질문과 답변

Greph 문서의 간단한 답변.

Greph 설명서에서 CLI 참조, PHP API, 인덱스 모드 및 rg와 sg 래퍼를 확인하세요.