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进行代码结构搜索和重构。

相关推荐
无籽西瓜a3 小时前
【西瓜带你学设计模式 | 第十四期 - 享元模式】享元模式 —— 内外状态分离与对象共享实现、优缺点与适用场景
java·设计模式·软件工程·享元模式
wxl7812271 天前
驾驭工程 (Harness Engineering):AI Agent 时代的软件工程新范式
人工智能·软件工程
workflower2 天前
注塑机行业目前自动化现状分析
运维·人工智能·语言模型·自动化·集成测试·软件工程·软件需求
watersink2 天前
第29章 2023真题作文
软件工程
watersink2 天前
第31章 2025真题作文
软件工程
watersink2 天前
第30章 2024真题作文
软件工程
darkhorsefly2 天前
业务流程及业务流程优化
软件工程·业务流程·业务流程优化
darkhorsefly2 天前
产品需求分析和项目需求分析的差异
软件工程·需求分析
无籽西瓜a2 天前
【西瓜带你学设计模式 | 第十二期 - 装饰器模式】装饰器模式 —— 动态叠加功能实现、优缺点与适用场景
java·后端·设计模式·软件工程·装饰器模式