ast-grep

一、功能分析

开源地址

https://github.com/ast-grep/ast-grep

支持的广泛语言范围

1. 后端/服务端语言

yaml 复制代码
Java:       pattern: "public class $CLASS"
Go:         pattern: "func $NAME($ARGS)"
Python:     pattern: "def $FUNC($ARGS):"
Ruby:       pattern: "def $METHOD"
PHP:        pattern: "function $FN($PARAMS)"
C#:         pattern: "public void $METHOD()"
Rust:       pattern: "fn $function($params)"

2. 系统/底层语言

yaml 复制代码
C:          pattern: "int $func(int $arg)"
C++:        pattern: "class $CLASS {"
Rust:       pattern: "impl $TRAIT for $STRUCT"

3. 脚本语言

yaml 复制代码
Bash/Shell: pattern: "function $NAME()"
PowerShell: pattern: "function Get-$CMD"
Lua:        pattern: "function $FUNC()"

4. 数据/配置语言

yaml 复制代码
YAML:       pattern: "$KEY: $VALUE"
JSON:       pattern: "\"$KEY\": $VALUE"
TOML:       pattern: "$KEY = \"$VALUE\""
XML:        pattern: "<$TAG>$CONTENT</$TAG>"
SQL:        pattern: "SELECT $COLUMNS FROM $TABLE"

5. 移动/桌面开发

yaml 复制代码
Swift:      pattern: "func $function()"
Kotlin:     pattern: "fun $FUNCTION($ARGS)"
Dart:       pattern: "void $main()"

基于 Tree-sitter 的完整支持列表

ast-grep 使用 Tree-sitter 作为解析器后端,支持50+种编程语言

官方支持的语言

复制代码
# 常用后端语言
python, java, go, rust, cpp, c, csharp, ruby, php, scala, kotlin, swift

# 前端语言
javascript, typescript, jsx, tsx, vue, svelte

# 函数式语言
haskell, ocaml, fsharp, elixir, clojure

# 脚本语言
lua, bash, powershell, perl, r

# 数据/配置
yaml, json, toml, xml, html, css, sql, graphql, protobuf

# 其他
dockerfile, make, cmake, ini, markdown, regex, solidity

实际使用示例

1. 查找所有 Go 函数

bash 复制代码
# 搜索Go项目中所有函数定义
sg scan -p 'func $NAME($ARGS)' --lang go ./src

2. 查找 Python 类方法

bash 复制代码
# 查找Python类中的方法
sg scan -p 'def $METHOD(self, $ARGS):' --lang python .

3. 检查 Java 异常处理

bash 复制代码
# 查找没有处理异常的方法
sg scan -p 'public void $METHOD() throws $EXCEPTION' --lang java ./src

4. SQL 查询分析

bash 复制代码
# 查找所有SELECT语句
sg scan -p 'SELECT $COLUMNS FROM $TABLE' --lang sql ./queries

语言特定功能

支持语言特定的语法特性:

  1. Java注解@GetMapping("/api")
  2. Python装饰器@app.route("/")
  3. C#属性[HttpGet]
  4. Rust宏#[derive(Debug)]
  5. Go接口type $INTERFACE interface {

配置文件扫描示例:

bash 复制代码
# Dockerfile 检查
sg scan -p 'FROM $IMAGE:latest' --lang dockerfile .

# Kubernetes YAML
sg scan -p 'image: $NAME:$TAG' --lang yaml ./k8s

为什么支持这么广泛?

  1. Tree-sitter 生态:有丰富的语法解析器
  2. 统一模式语法:同一套模式语法适用于所有语言
  3. 可扩展架构:可以轻松添加新语言支持

跨语言搜索示例

查找所有打印/日志语句:

yaml 复制代码
# JavaScript/TypeScript
pattern: console.log($ARG)

# Python
pattern: print($ARG)

# Java
pattern: System.out.println($ARG)

# Go
pattern: fmt.Println($ARG)

# Rust
pattern: println!($ARG)

实际应用场景

1. 多语言代码库扫描

bash 复制代码
# 扫描整个包含多种语言的项目
sg scan -r security-rules/ ./monorepo
# 可同时检查JS、Python、Go等

2. API端点统一查找

bash 复制代码
# 查找各种语言中的API路由定义
# Express (Node.js)
sg scan -p "app.get('$PATH', $HANDLER)" --lang typescript

# Flask (Python)
sg scan -p "@app.route('$PATH')" --lang python

# Spring Boot (Java)
sg scan -p "@GetMapping(\"$PATH\")" --lang java

总结

ast-grep 是一个真正的多语言工具,不仅限于前端。它的强大之处在于:

  1. 语言无关:同一套工具和模式语法适用于50+语言
  2. 深度分析:基于AST而非文本,能理解代码结构
  3. 企业级应用:适合大型、多语言代码库的代码质量、安全扫描和重构

无论是微服务架构(包含多种语言),还是全栈项目,ast-grep 都能提供一致的代码分析体验。

二、安装方式

根据ast-grep的GitHub页面信息,这里提供几种安装方法:

官方推荐安装方式

1. 使用Cargo安装(推荐)

bash 复制代码
# 安装Rust工具链(如果尚未安装)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 安装ast-grep
cargo install ast-grep

# 验证安装
sg --version

2. 使用npm安装

bash 复制代码
# 全局安装
npm install -g @ast-grep/cli

# 或作为开发依赖
npm install --save-dev @ast-grep/cli

3. 使用Homebrew安装(macOS/Linux)

bash 复制代码
# 添加tap
brew tap ast-grep/ast-grep

# 安装
brew install ast-grep

4. 从源代码构建

bash 复制代码
# 克隆仓库
git clone https://github.com/ast-grep/ast-grep.git
cd ast-grep

# 构建并安装
cargo install --path .

快速验证安装

安装完成后,运行以下命令验证:

bash 复制代码
# 查看版本
sg --version

# 查看帮助
sg --help

# 运行简单测试
sg scan -p 'console.log($MSG)' --lang javascript

各平台安装详情

Windows用户

powershell 复制代码
# 1. 安装Rust(使用rustup-init.exe)
# 2. 然后运行
cargo install ast-grep

# 或使用WSL,按照Linux方法安装

Linux用户

bash 复制代码
# Ubuntu/Debian
sudo apt update
sudo apt install build-essential
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
cargo install ast-grep

macOS用户

bash 复制代码
# 方法1:使用Homebrew(最简单)
brew install ast-grep

# 方法2:使用Cargo
xcode-select --install  # 安装命令行工具
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install ast-grep

安装后配置

1. 添加到PATH(如果需要)

bash 复制代码
# 对于Cargo安装,通常自动添加
# 如果找不到sg命令,手动添加
export PATH="$HOME/.cargo/bin:$PATH"

2. 安装语言支持

ast-grep依赖tree-sitter语法文件,首次使用时会自动下载:

bash 复制代码
# 手动安装常用语言支持
sg new typescript  # 安装TypeScript支持
sg new python      # 安装Python支持
sg new go          # 安装Go支持

3. 验证完整功能

bash 复制代码
# 创建测试文件
echo 'console.log("hello")' > test.js

# 运行扫描
sg scan -p 'console.log($MSG)' --lang javascript test.js
# 应该输出匹配结果

升级ast-grep

bash 复制代码
# Cargo安装
cargo install ast-grep --force

# Homebrew安装
brew upgrade ast-grep

# npm安装
npm update -g @ast-grep/cli

故障排除

常见问题:

  1. 命令未找到 :确保$HOME/.cargo/bin在PATH中
  2. 构建失败 :更新Rust工具链 rustup update
  3. 权限问题 :使用sudo或修改目录权限

获取帮助:

bash 复制代码
# 查看详细文档
sg --help

# 访问GitHub Issues
# https://github.com/ast-grep/ast-grep/issues

选择最适合你开发环境的安装方式即可开始使用ast-grep进行代码结构搜索和重构。

相关推荐
嘿黑嘿呦14 天前
chap 8排序
算法·蓝桥杯·排序算法·软件工程
旧曲重听115 天前
2026前端技术从「夯」到「拉」
前端·程序人生·职场和发展·软件工程
承渊政道15 天前
飞算JavaAI 智能引导背后的多 Agent 协作机制解析:从老旧 Java 后台升级到可运行工程
java·开发语言·spring boot·安全·intellij-idea·软件工程·ai编程
apcipot_rain15 天前
计科八股20260616(1)——堆存中位数、链表判环、黑白测试、敏捷开发与瀑布模型、配置管理、持续集成、池化
数据结构·算法·软件工程
lisw0515 天前
【计算机科学技术】路由器(route):概念、历史、内容与战略!
机器学习·智能路由器·软件工程
培培说证16 天前
大数据、人工智能、计算机、软件工程,到底怎么选?
大数据·人工智能·软件工程
文艺倾年16 天前
【强化学习】MDP、贝尔曼方程与CartPole 编程,20W字总结(二)
人工智能·软件工程·强化学习
郝学胜-神的一滴16 天前
CMake 017:彩色日志输出实战
linux·c语言·开发语言·c++·软件工程·软件构建·cmake
小程故事多_8016 天前
AI软件工程范式革命,终结五十年的“手工伪工程”时代
人工智能·软件工程
精益数智小屋17 天前
项目管理看板如何拆解任务进度?项目管理看板解决跨部门协作难题
大数据·人工智能·数据分析·云计算·软件工程