1P by GN⁺ 11시간전 | ★ favorite | 댓글 1개
  • ripgrep 15.0은 버그 수정, 성능 개선, 새로운 기능 추가 등 다양한 업데이트를 포함하는 주요 릴리스임
  • gitignore 규칙 적용에 관한 버그가 다수 수정되었고, 대용량 파일 처리 시 메모리 최적화가 이루어짐
  • 윈도우 aarch64 플랫폼 지원이 추가되고, powerpc64 지원 중단이 이루어짐
  • 일부 새로운 기능으로는 --json과 대체 플래그 동시 지원, globs의 중첩 중괄호 지원 등이 있음
  • 전반적인 성능 개선과 오류 수정, 사용성 향상으로 개발자 생산성이 높아짐

ripgrep 15.0 개요

ripgrep 15.0은 ripgrep의 최신 주요 버전 릴리스로, 주로 버그 수정, 마이너 성능 향상 및 소규모 신규 기능 추가를 포함함

ripgrep은 라인 단위로 현재 디렉토리에서 정규 표현식 패턴을 재귀적으로 검색하는 도구임
기본적으로 gitignore 규칙을 따르며, 숨김 파일/디렉토리 및 바이너리 파일을 자동으로 건너뜀

주요 변경사항

  • 여러 gitignore 매칭 관련 버그가 수정됨
    • 상위 디렉토리의 gitignore 규칙 적용과 관련된 자주 보고된 버그 해결
  • 아주 큰 gitignore 파일 처리 시 발생한 메모리 사용량 증가 버그가 해결됨
  • rg -vf file에서 file이 비어있을 때 모두 매치하게 변경됨
  • -r/--replace 플래그가 이제 --json과 함께 정상 동작함
  • 일부 Jujutsu(jj) 저장소도 git 저장소처럼 인식하여, ripgrep에서 jj의 gitignore를 따름
  • Globs가 중첩 중괄호를 지원함

플랫폼 지원

  • Windows용 aarch64에 대한 릴리스 바이너리가 새로 제공됨
  • powerpc64에 대한 릴리스 바이너리는 더 이상 제공되지 않음
    • CI 릴리스 워크플로 문제로 인한 중단, 테스트와 지원을 원하면 요청 가능
  • ripgrep 바이너리가 LTO(전체 링크 타임 최적화) 로 컴파일되어, 소폭의 성능 향상과 크기 감소 효과가 있음

성능 향상

  • Windows에서 -z/--search-zip 옵션 미사용 시, helper 바이너리 탐색 비활성화로 성능 개선
  • Windows에서 하이퍼링크 출력 시 경로 정규화 생략으로 속도 향상
  • -A/--after-context 사용 시 대용량 값 처리 성능 향상

버그 수정

  • 상위 디렉토리 gitignore 적용 누락 등 여러 gitignore 관련 이슈 다수 수정
  • 비어있는 파일을 대상으로 한 rg -vf file 명령이 모두 매치하도록 수정
  • .gitignore 등에서 UTF-8 BOM 마커 무시하는 처리 추가
  • 대용량 gitignore 파일 처리 시 메모리 사용 최적화
  • --stats 사용 시 검색된 바이트 수 출력 오류 수정
  • .으로 끝나는 glob 처리 오류 수정
  • -m/--max-count, -U/--multiline 조합 사용 시 매치 수 초과 표시 문제 해결
  • -r/--replace 플래그 사용 시 라인 종결자 보존하도록 변경
  • -q --files-without-match 조합 사용 시 종료 코드 반전 오류 해결
  • -c/--count--files-with-matches의 문서 불일치 해결
  • 대형 정규표현식 및 입력 시 드물게 발생한 panic 문제 수정
  • man page의 옵션 플래그명 하이픈 이스케이프 처리
  • macOS aarch64 릴리스에서 PCRE2 정적 컴파일 처리
  • 화이트리스트 숨김 파일 검색 시 상위 디렉토리 무시 필터 버그 수정
  • --json 플래그 사용 시 잘못된 요약 통계 문제 해결
  • 절대 경로 및 전역 gitignore 검색 시 gitignore 처리 오류 수정
  • -U/--multiline-r/--replace 조합 사용 시 발생하던 panic 문제 수정

기능 개선

  • 기본 파일 타입 집합이 대폭 확장개선
  • -r/--replace--json과 호환되게 개선
  • fish shell의 완성 기능이 ripgrep 설정 파일을 반영하도록 개선
  • --color에 사용할 수 있는 스타일 속성에 italic 추가
  • .jj 디렉토리를 git 저장소로 취급
  • 멀티스레딩 사용 시, CLI에서 지정한 파일 순서대로 검색을 예약하는 기능 추가
  • Windows용 aarch64 릴리스 아티팩트 추가
  • highlight 컬러 타입이 추가되어, 매칭된 줄의 비매칭 텍스트 스타일링 가능
  • globs 및 globset crate에 중첩 alternates 기능 추가
  • --hyperlink-format 자동완성 기능이 bash, fish, zsh에서 개선됨
Hacker News 의견
  • ripgrep은 지난 수년간 정말 많은 시간을 절약해준 툴임, 새 시스템을 시작할 때마다 가장 먼저 설치하는 필수 도구임, 특히 오래된 코드베이스를 탐색할 때 없어서는 안 될 존재임, 한 가지 아쉬운 점은 -F(리터럴 취급) 옵션을 쓸 때도 몇몇 문자가 여전히 이스케이프가 필요한 특수문자로 처리되는 경우가 있다는 점임, 정확히 어떤 문자인지는 기억이 안 남, 그래도 ripgrep이 계속 업데이트되는 걸 볼 때마다 기쁨

    • 만약 어떤 문자에서 문제가 있었는지 예시를 알려주면 구체적으로 설명해줄 수 있음, -F/--fixed-strings는 패턴에서 100% 정규 표현식 기능을 끄고 리터럴로만 처리함, 이스케이프가 필요하다면 그건 아마 쉘에서 요구하는 것이 원인일 수 있음
  • rg는 마치 마법처럼 느껴지는 툴임, 실제로는 탁월한 엔지니어링과 꾸준한 개선, 그리고 우리 모두가 매일 사용하는 놀라운 하드웨어 성능을 십분 활용한 결과임, 또한 lsp 같은 표준을 따로 만들 필요 없이 개발자들이 더 빠르게 코드 탐색과 이해를 할 수 있도록 가능성을 열어준 혁신임

    • smithing이 이 맥락에서 무슨 뜻인지 정말 궁금함
  • ripgrep 코드베이스는 "음료를 준비하고 가장 편한 의자에 앉아 고품질 소프트웨어를 탐독하는" 최고의 예시임, 이리저리 코드 구석구석을 클릭하며 감탄하게 됨

  • fd처럼 rg도 진짜 사용이 즐거운 커맨드라인 툴임, 이런 새로운 명령어 기반 툴들을 좋아함

    • ripgrep과 fd의 저자들이 Astral에서 근무한다는 사실을 최근에 알게 됨, 그래서 Astral 소프트웨어가 이렇게 좋구나 싶음
    • 두 툴 모두 별다른 옵션 없이도 기본값이 99% 내가 원하는 대로 동작함, 엄청난 시간 절약임, 예를 들어 rg <string> 또는 fd <string> 하나만 입력해도 충분함
  • 개인적으로 추가됐으면 하는 기능은 "확장자" 플래그임, -g처럼 동작하지만 입력 인자를 확장자로 처리하는 기능임 (예시: rg -e c,h처럼), 대부분 glob 패턴을 쓸 때 확장자 매칭이 목적이기 때문임

    • -t/--type 플래그를 본 적 있는지 묻고 싶음, 예시처럼 -tc로 쓸 수 있음, ripgrep에 없는 확장자라면 직접 type을 정의할 수도 있음
  • ripgrep은 내가 rust에 관심을 갖기 시작한 주요 계기임, 너무 완성도 높게 동작해서 rust로 작성됐다는 사실에 더 궁금증이 생겼음, 몇 년이 지난 지금도 매일 rg를 사용하고 있음

    • nibbles가 내가 qbasic에 흥미를 갖게 된 주요 이유였음, 완성도 높아서 qbasic으로 작성된 점에 흥미를 느꼈고, 덕분에 nibbles를 매일 사용하게 되었음
  • 최근에는 --replace 옵션을 발견했고 꽤 인상적이었음, --type과 함께 사용하면서 이전에 이런 멋진 기능들이 있다는 것을 모르고 있었다는 점이 아쉬웠음, 앞으로는 릴리즈 노트를 꼼꼼히 읽으면서 새로운 기능에 더 민감하게 대응할 생각임, jj와의 연동 기능 향상도 반가움

  • 훌륭한 툴이면서도 사용성이 매우 쉬움, 처음에는 Linux에서 쓰기 시작했는데 지금은 Windows에서도 쓰고 있음, 이 도구 덕분에 이제는 wildcard 대신 정규 표현식을 바로 검색에 활용하게 됨

    • 기본 grep보다 더 좋고, rg --files명령도 유용함
  • 이번 주에 bash 함수로 git이 추적하는 파일에서만 ripgrep을 실행하는 함수를 만들었음

      rgg() {
        readarray -d '' -t FILES < <(git ls-files -z)
        rg "${@}" "${FILES[@]}"
      }
    

    바이너리 파일이나 dot 파일이 많은 디렉토리에서 훨씬 빠르게 검색할 수 있음, dot 파일을 검색하려면 -uu 옵션이 필요하지만, 이 옵션은 바이너리 파일까지 검색하게 됨, 파일 수가 수백 개일 때는 git ls-files 자체가 느려짐

    • 혹시 그렇게 했을 때 속도가 더 빨라진 구체적인 예시가 있을지 궁금함, 일반적으로 ripgrep은 이미 gitignore 규칙을 존중해서 git ls-files와 비슷하게 동작함, 참고로 -uu 옵션은 ripgrep이 gitignore와 hidden 파일을 무시하라는 뜻인데, 그래도 바이너리 파일은 건너뜀, 바이너리 파일까지 포함하려면 -uuu가 필요함, 함수에서 제일 큰 문제는 리눅스 커널 리포에 썼을 때 argument list가 너무 길다는 에러가 뜬다는 점임, 그래서 xargs로 바꿔봄
        $ git ls-files -z | time xargs -0 rg APM_RESUME
        ...
      
        real  0.638
        user  0.741
        sys   1.441
        maxmem 29 MB
        faults 0
        $ time rg APM_RESUME
        ...
      
        real  0.097
        user  0.399
        sys   0.588
        maxmem 29 MB
        faults 0
      
      이런 상황에서 git ls-files -z | xargs -0 rg ...가 그냥 rg ...보다 더 빠른 예시가 있으면 공유를 부탁함
    • 이 글을 쓰고 나서 매뉴얼을 다시 읽어보니 -uu 대신 -. 플래그(숨김 파일 검색 전용)를 쓸 수 있다는 걸 알게 됨, git이 추적하는 숨김 파일을 검색할 수 있으면 좋겠지만, 파일 목록을 쿼리할 때 생기는 오버헤드가 러스트로 짜도 무시 못할 정도임
    • 내가 뭔가 놓친 건지 모르겠지만, ripgrep은 원래 git에서 추적되지 않는 파일을 기본적으로 무시하는 것 아님?
    • 이 방식이 git grep보다 빠른지 궁금함
  • 매일 업무에서 ripgrep을 사용함, 커맨드라인에서도 vscode에서 검색할 때도 항상 씀, burntsushi에게 고마움을 전함