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

相关推荐
互联网推荐官3 小时前
上海物联网应用开发技术路径拆解:从协议选型到平台架构的工程实践
大数据·人工智能·软件工程
极创信息3 小时前
信创领域五种主流CPU架构(X86 / ARM / RISC-V / MIPS / LoongArch)
java·arm开发·数据库·spring boot·mysql·软件工程·risc-v
Thanks_ks3 小时前
软件系统中的熵增定律:技术债的形成与重构的艺术
软件工程·敏捷开发·架构设计·状态管理·代码重构·技术债·康威定律
互联网推荐官1 天前
上海小程序开发实践:技术选型、场景分化与平台能力的全面审视
人工智能·软件工程
a里啊里啊1 天前
软考-软件评测师:知识点整理(七)——软件工程
设计模式·软件工程·软考·uml·结构化开发·软件评测师·软件模型
互联网推荐官2 天前
上海小程序开发:从技术架构到工程落地的完整拆解
人工智能·物联网·软件工程
故事还在继续吗2 天前
二进制小型化优化
软件工程
weixin_446260852 天前
软件工程工具链机制的认知模型:打造可持续、可复现的开发工作流
软件工程
Ting.~2 天前
软件设计师备考笔记【day2】-软件工程
笔记·软件工程
互联网推荐官3 天前
上海物联网应用开发的协议选型与平台架构实践
人工智能·物联网·软件工程