TopGit
Đánh giá repo GitHub

ast-grep: viết lại code và tìm kiếm cấu trúc CLI

ast-grep/ast-grep
ATopGit review image for ast-grep/ast-grep
Review by Topgit.dev for ast-grep/ast-grep, with GitHub repository stats and README context.
Nhận định nhanh

ast-grep là công cụ dòng lệnh tìm kiếm, kiểm tra lint và viết lại code bằng cách so khớp cấu trúc cây cú pháp trừu tượng (AST), thay vì so khớp văn bản thô, nên pattern `$A && $A()` bắt đúng cấu trúc đó ở mọi nơi bất kể tên biến khác nhau. Nên dùng khi cần chạy một codemod trên codebase TypeScript hoặc JavaScript lớn mà không muốn tự viết script babel. Chỉ cần thay một đoạn văn bản một lần thì grep hay sed vẫn gọn hơn.

Sao
★ 16.3k
Fork
⑂ 482
Ngôn ngữ
Rust
Giấy phép
MIT
Chủ đề
Developer Tools
Cập nhật
Oct 2026
Trang chủ
GitHub

Hiểu cơ chế so khớp code theo cấu trúc của ast-grep

ast-grep là một CLI viết bằng Rust, phân tích source code thành cây cú pháp trừu tượng (AST) bằng tree-sitter, rồi so khớp pattern với cấu trúc của cây đó thay vì với văn bản gốc. Pattern được viết trông giống code bình thường, dùng dấu `$` cộng chữ hoa (như `$MATCH`) làm ký tự đại diện cho bất kỳ node AST nào. Cùng một engine so khớp này vận hành ba lệnh: search, lint qua file rule YAML, và rewrite.

Các khả năng cốt lõi để biến đổi code

  • ✓Cú pháp pattern trông như code thật — viết `$PATTERN` ở vị trí một biểu thức, nó sẽ bắt bất kỳ node AST nào ở đó mà không cần escape ký tự như regex.
  • ✓Ký tự đại diện `$` cộng chữ hoa (`$MATCH`, `$A`,...) cho phép bắt một node rồi tham chiếu lại ở chỗ khác trong cùng pattern hoặc trong phần thay thế của `--rewrite`.
  • ✓Cờ `--rewrite` biến một pattern đã khớp thành một thay đổi code tự động, chạy trực tiếp từ dòng lệnh nhắm vào ngôn ngữ chỉ định qua `--lang`.
  • ✓File rule YAML để định nghĩa các kiểm tra lint hoặc chuỗi rewrite nhiều bước dưới dạng cấu hình, thay vì viết một script riêng cho từng rule.
  • ✓Một API để duyệt và thao tác trên AST, phỏng theo phong cách chuỗi lệnh (chaining) kiểu jQuery, dùng để viết script kiểm tra vượt ra ngoài các cờ có sẵn của CLI.
  • ✓Một binary Rust được biên dịch sẵn, phân tích bằng tree-sitter và theo README có tận dụng nhiều nhân CPU.
  • ✓Một playground chạy trên trình duyệt để thử pattern với code mẫu trước khi viết bất kỳ cấu hình nào ở máy local.
Số sao GitHub của repo này thay đổi thế nào theo thời gian. Nguồn: star-history.com.Xem lịch sử sao ↗

Ai nên dùng ast-grep?

ast-grep phù hợp với các lập trình viên cần thay đổi nhiều vị trí gọi hàm theo cùng một cách: người duy trì thư viện mã nguồn mở khi tung ra một thay đổi API gây breaking change, tech lead muốn một rule lint kiểm tra theo cấu trúc code thay vì theo mẫu văn bản, và bất kỳ ai đang làm một lần migration như ví dụ viết lại cấu hình Zodios trong README. Công cụ này ít hữu ích hơn cho việc tìm chuỗi văn bản đơn giản trên nhiều file — lúc đó grep thông thường vẫn là lựa chọn nhanh hơn.

Bắt đầu với ast-grep

Theo README, ast-grep cài được qua nhiều trình quản lý package: `npm install --global @ast-grep/cli` (người dùng Node có thể cần chạy thêm `pnpm approve-builds`), `pip install ast-grep-cli`, hoặc `brew install ast-grep`. Ngoài ra còn có `cargo install ast-grep --locked`, `cargo binstall ast-grep`, Scoop (`scoop install main/ast-grep`), MacPorts (`sudo port install ast-grep`), Nix (`nix-shell -p ast-grep`), và mise (`mise use -g ast-grep`). Để build từ source, cài rustup, clone repo rồi chạy `cargo install --path ./crates/cli --locked`. README cũng dẫn tới Repology để tìm package cho các nền tảng khác.

Ví dụ dòng lệnh và các pattern

Cấu trúc lệnh cốt lõi là `ast-grep --pattern 'var code = $PATTERN' --rewrite 'let code = new $PATTERN' --lang ts`, tìm mọi chỗ khớp pattern và viết lại trong một lần chạy. Chính README cũng đưa ví dụ dùng cờ viết tắt: `ast-grep -p '$A && $A()' -l ts -r '$A?.()'` chuyển một lệnh gọi có kiểm tra điều kiện thành optional chaining, còn `ast-grep -p 'new Zodios($URL, $CONF as const,)' -l ts -r 'new Zodios($URL, $CONF)' -i` dùng để migrate một lệnh gọi cấu hình Zodios. Các rule lint hay codemod phức tạp hơn một pattern đơn dòng thì được viết dưới dạng cấu hình YAML thay vì truyền trực tiếp trên dòng lệnh.

Vì sao chọn ast-grep để thao tác code?

  • ✓So khớp theo cấu trúc không bị vỡ như so khớp văn bản khi code được format lại hoặc biến được đổi tên — pattern vẫn khớp đúng cấu trúc đó.
  • ✓Không cần viết hẳn một script thao tác AST từ đầu chỉ cho một lần codemod; cú pháp pattern trông giống code bạn vẫn viết hằng ngày.
  • ✓Cài được qua các trình quản lý package mà hầu hết lập trình viên đã có sẵn — npm, pip, cargo, hoặc Homebrew — không cần trình cài đặt riêng.
  • ✓Giấy phép MIT, nên đưa vào pipeline CI của một dự án thương mại không phát sinh vướng mắc về bản quyền.
  • ✓Rule lint và rule rewrite dùng chung một engine so khớp và cùng định dạng YAML, nên chỉ cần học một cú pháp cho cả hai việc.

Những điều cần cân nhắc khi dùng ast-grep

  • △README không công bố số liệu benchmark, nên mọi nhận định về tốc độ trên codebase rất lớn chỉ dựa trên kiến trúc Rust/tree-sitter chứ không phải kết quả đo thực tế.
  • △Tài liệu được cung cấp ở đây không liệt kê đầy đủ các ngôn ngữ được hỗ trợ; muốn xác nhận một ngôn ngữ ít phổ biến có grammar hay không thì phải kiểm tra trên trang chính thức của ast-grep.
  • △Viết một pattern bắt đúng cấu trúc AST cần học nhiều hơn so với viết regex, nhất là khi bạn chưa quen cách grammar của ngôn ngữ đích tổ chức các biểu thức.
  • △Các cờ như `-i` xuất hiện trong ví dụ của chính README mà không được giải thích kèm theo, nên người mới dùng nhiều khả năng phải tra thêm tài liệu bên ngoài để hiểu hết từng tùy chọn.
Xem trên GitHub ↗Trang chủ ↗

So sánh ast-grep với các công cụ khác

ripgrep — tìm văn bản thuần nhanh hơn ast-grep cho các truy vấn chuỗi đơn giản, nhưng không hiểu gì về cấu trúc code. ↗ESLint — công cụ lint JavaScript/TypeScript đã trưởng thành qua hệ thống plugin; cấu hình nặng hơn so với việc viết một rule YAML của ast-grep cho một kiểm tra cấu trúc đơn lẻ.Semgrep — một công cụ phân tích tĩnh theo pattern khác, hỗ trợ nhiều ngôn ngữ, có cách tiếp cận tìm kiếm và viết lại tương tự ast-grep. ↗Comby — công cụ tìm kiếm và thay thế theo cấu trúc với ngôn ngữ pattern riêng, giải quyết những bài toán codemod tương tự.

Câu hỏi thường gặp về ast-grep

ast-grep hỗ trợ những ngôn ngữ lập trình nào?

ast-grep so khớp code qua các grammar của tree-sitter, và chính ví dụ trong README chạy trên TypeScript bằng cờ `-l ts`. Tài liệu này không liệt kê đầy đủ danh sách ngôn ngữ được hỗ trợ, nên hãy kiểm tra trang chính thức của ast-grep để biết mức độ hỗ trợ grammar hiện tại.

ast-grep có miễn phí và mã nguồn mở không?

ast-grep miễn phí và mã nguồn mở, phát hành theo giấy phép MIT và lưu trữ công khai trên GitHub, nơi repo này có 15.402 sao và 424 fork.

ast-grep khác gì so với grep truyền thống?

grep truyền thống so khớp văn bản theo từng dòng, nên dễ bắt nhầm ở comment, chuỗi ký tự, hoặc đoạn code chỉ mới được format lại. ast-grep thì phân tích code thành cây cú pháp trừu tượng qua tree-sitter rồi so khớp theo cấu trúc, nên một pattern như `$A && $A()` tìm đúng cấu trúc đó dù tên biến hay khoảng trắng có khác nhau.

ast-grep có dùng để áp rule lint tùy chỉnh được không?

ast-grep hỗ trợ rule lint tùy chỉnh thông qua file cấu hình YAML, cho phép bạn định nghĩa các kiểm tra theo pattern phù hợp với quy ước riêng của codebase, thay vì chỉ dựa vào rule dựng sẵn.

Có playground trực tuyến để thử ast-grep không?

ast-grep có một playground chạy trên trình duyệt, được dẫn link từ README, cho phép bạn thử một pattern với code mẫu ngay trên web trước khi cài bất cứ thứ gì ở máy local.

Hiệu năng của ast-grep trên codebase lớn ra sao?

README không công bố số liệu benchmark cho ast-grep, nhưng đây là một binary Rust được biên dịch sẵn, phân tích bằng tree-sitter và theo README có tận dụng nhiều nhân CPU — đúng kiểu kiến trúc cần thiết để quét một codebase lớn nhanh, dù không có con số công bố cụ thể để dẫn chứng.

Vấn đề mà ast-grep giải quyết

Refactor trên cả một codebase thường buộc phải chọn giữa hai phương án không trọn vẹn: một lệnh grep/sed so khớp văn bản và vỡ trận ngay khi code được format lại hoặc biến đổi tên, hoặc một AST transform đầy đủ viết bằng thứ như babel, đòi hỏi thiết lập không nhỏ cho một thay đổi có khi chỉ chạy một lần. ast-grep nằm ở giữa hai lựa chọn đó — pattern của nó trông như code bình thường nên chi phí bắt đầu gần với grep, nhưng việc so khớp lại dựa trên cấu trúc AST, nên nó không bị phá vỡ bởi thay đổi khoảng trắng hay đổi tên biến như so khớp văn bản.

Các use case phù hợp nhất

  • •Đính kèm một rewrite rule cùng với một thay đổi API gây breaking change, để người dùng thư viện tự động migrate code thay vì phải đọc hướng dẫn nâng cấp thủ công.
  • •Mã hóa quy ước code riêng của team thành rule lint YAML rồi chạy trong CI để bắt một cấu trúc code mà linter dựa trên regex sẽ bỏ sót.
  • •Thử nghiệm một kiểm tra theo mẫu lỗ hổng bảo mật dưới dạng pattern AST thay vì phải xây cả một plugin phân tích tĩnh từ đầu.
  • •Các đợt migration framework một lần, như ví dụ viết lại cấu hình Zodios trong README, được script hóa thay vì sửa tay từng vị trí gọi hàm.

Repo liên quan

Nguồn & ghi công

Thông tin và nội dung README lấy từ repository GitHub ast-grep/ast-grep (github.com/ast-grep/ast-grep).

Dữ liệu GitHub · đồng bộ lần cuối 6 thg 8, 2026Đánh giá bởi Henry
← Về TopGit

Muốn nghe thêm một ý kiến về ast-grep?

Hỏi một AI đọc được trang này — một cú bấm là có ngay nhận định về ast-grep.

GitHub