前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Guarding:开源的多语言架构守护工具

Guarding:开源的多语言架构守护工具

作者头像
Phodal
发布2021-07-15 09:46:20
7950
发布2021-07-15 09:46:20
举报
文章被收录于专栏:phodal

这是一篇姗姗来迟的文章 ,我本应该紧接着在《架构守护代码化:架构文档即测试》一文之后,详细介绍我们在 Uncode 中引入的『架构守护代码化』工具 Guarding。不过呢,从时间点上来看,现在也不算太晚,笑。

Guarding 简介

Guarding 是一个可以用于 Java、JavaScript、Rust、Go 等语言的架构守护工具。受 ArchUnit 的启发,借助于易于理解的 DSL,来编写守护规则。支持 Windows、macOS、GNU/Linux 系统。

使用

简单来说,就是我们可以使用一个易于阅读的 DSL 来编写架构规则。而这些个架构规则,可以用于主流的语言。如下是使用 Guarding 编写的规则示例:

代码语言:javascript
复制
package(".")::file.len should < 200;
package(".")::file.len should > 50;

class("java.util.Map") only accessed(["com.phodal.pepper.refactor.staticclass"]);
class(implementation "BaseParser")::len = 2
class(implementation "BaseParser")::name should not contains "Lexer";

struct("..myapp..")::function.name should contains("Model");
struct("..myapp..")::function.name contains("");

从上面的示例里,你可以发现 :

  1. 如果你熟悉 ArchUnit 的话,就能很快的上手 Guarding 的编写。当然了,还有很多语法还在开发中。
  2. Guarding 可以很支持中文。但是,我觉得这中英文模板切换就是个问题。
  3. Guarding 可以支持更多的语法,如针对于 Rust 或者 Golang, class 可以换成 struct

运行

运行起 Guarding 也非常简单,只需要 guarding . 就可以了。

安装

当然了,安装也非常简单,直接从 GitHub 下载:https://github.com/inherd/guarding 。或者是,如果你有 Rust 的环境的话,那么你可以直接: cargo install guarding

扩展

那么,如何扩展 Guarding 呢?

Guarding 架构

下图是 Guarding 的处理流程:

Guarding Architecture

简单来说,Guarding 的程序为三部分:

  1. Guarding 规则解析器。
  2. 多语言解析器。使用 Treesitter 作为解析工具,配合 S 表达式进行解析。
  3. Guarding 规则执行器。

多语言源码解析

在语言解析这事上吧,我又经历了一系列的尝试。

解析方式选型

基于 Antlr 的标准语言解析。起先在设计 Guarding 的时候,我是打算使用类似于 Coca 的方式,基于 Antlr 官方维护的一个三方贡献的语法库。而对于我来说,这是一种旧的解析方式,所以我使用它的可能性不大。

基于 Ctags 的语法分析。另外一种选择是使用在设计 Modeling 的时候,引入的是 Ctags。Ctags 是一个用于从程序源代码树产生索引文件(或tag文件),从而便于文本编辑器来实现快速定位的实用工具。而使用 Ctags 需要引入二进制的包。于是,首先我尝试构建了 ctags-sys,随后还需要编写 ctags 长长解析方式,时间成本有点高。

基于 LSP 的语法分析。我短暂的评估过采用 LSP (Language Server Protocol )的方式,但是使用 LSP 意味着:引入更多的语言相关的依赖。所以,依旧是不可行的路线。

直至,在完善 Uncode 的一些设计时,发现有 Tree-sitter 能实现相关的功能。Tree-sitter 早先是在 Atom 编辑器中引入的一个试验性功能。Tree-sitter 支持 Rust、JavaScript、Python、Ruby、Haskell 语言。与 Haskell 和 Ruby 这种小众语言比,Rust 这种小众语言也就还行,哈哈。不过,从性能上来说,是这里面性能最好的。

解析示例

如下是一个简单的 C++ 语言的 Class 示例:

代码语言:javascript
复制
class MyClass {
public:
int myNum;
string myString;
};

TreeSitter 会将上述的 CPP 代码解析成语法树 (部分):

代码语言:javascript
复制
translation_unit [0, 0] - [6, 0]
class_specifier [0, 0] - [4, 1]
name: type_identifier [0, 6] - [0, 13]
body: field_declaration_list [0, 14] - [4, 1]
access_specifier [1, 2] - [1, 9]

随后,我们就可以编写对应的查询(query)语法树 S 表达式(S-expression):

代码语言:javascript
复制
(class_specifier
name: ((type_identifier) @class-name)
)

S 表达式会从语法树中区别到对应的节点,将节点信息赋给变量,如这里的 @class-name

你可以从 TreeSitter 官方提供的在线 Playground 尝试:https://tree-sitter.github.io/tree-sitter/playground

Guarding 语法解析与设计

Guarding 使用的是 Rust 语言开发的,由于之前已经用过了 Lalrpop、Antlr 等解析器,所以这次我们采用的解析器是:pest。虽然,我没有细究过,这几个不同的解析器在学术上的差距,我一般只会按需选择我用得少的。如下是 guarding.pest 的部分代码示例:

代码语言:javascript
复制
normal_rule = {
rule_level ~ ("(" ~ scope ~ ")")? ~ (use_symbol ~ expression)? ~ should? ~ only? ~ operator ~ assert ~ ";"?
}

rule_level = {
"package" |
"class" |
"struct" |
"function" |
"file"
}

docsexamples 里,有 Guarding 的语法开发过程中的记录和关键词信息。

包路径解析

值得一提的是包路径解析,所以我们的包解析方式参考的是 ArchUnit 的设计方式。

如何使用 Guarding 进行架构守护

Guarding 采用的是 Rust 语言,所以二进制是直接支持所有的主流操作系统。其次,我们采用的是 CLI 方式,因此可以在任何阶段中采用,如:

  • 在本地结合 Git Hook 进行代码预提交检查。
  • 在持续集成阶段,配合流水线工作使用。
  • 结合 IDEA / 编辑器插件进行实时检查(还没有实现)。

当然了,这个是适用于单个团队的处理方式。对于更大规模的团队来说,可以采用:

  1. 模板继承的方式(当然,还没有实现)

其它

欢迎加入 Guarding 的开发:https://github.com/inherd/guarding

本文参与?腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-29,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 phodal 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Guarding 简介
  • Guarding 架构
  • 多语言源码解析
    • 解析方式选型
      • 解析示例
      • Guarding 语法解析与设计
        • 包路径解析
        • 如何使用 Guarding 进行架构守护
        • 其它
        相关产品与服务
        持续集成
        CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com