一、功能分析
开源地址
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
语言特定功能
支持语言特定的语法特性:
- Java注解 :
@GetMapping("/api") - Python装饰器 :
@app.route("/") - C#属性 :
[HttpGet] - Rust宏 :
#[derive(Debug)] - 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
为什么支持这么广泛?
- Tree-sitter 生态:有丰富的语法解析器
- 统一模式语法:同一套模式语法适用于所有语言
- 可扩展架构:可以轻松添加新语言支持
跨语言搜索示例
查找所有打印/日志语句:
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 是一个真正的多语言工具,不仅限于前端。它的强大之处在于:
- 语言无关:同一套工具和模式语法适用于50+语言
- 深度分析:基于AST而非文本,能理解代码结构
- 企业级应用:适合大型、多语言代码库的代码质量、安全扫描和重构
无论是微服务架构(包含多种语言),还是全栈项目,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
故障排除
常见问题:
- 命令未找到 :确保
$HOME/.cargo/bin在PATH中 - 构建失败 :更新Rust工具链
rustup update - 权限问题 :使用
sudo或修改目录权限
获取帮助:
bash
# 查看详细文档
sg --help
# 访问GitHub Issues
# https://github.com/ast-grep/ast-grep/issues
选择最适合你开发环境的安装方式即可开始使用ast-grep进行代码结构搜索和重构。