大家好,今天来为大家解答guarding的这个问题的一些问题点,包括Guarding:开源的多语言架构守护工具也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
1、这是一篇姗姗来迟的文章,我本应该紧接着在《架构守护代码化:架构文档即测试》一文之后,详细介绍我们在Uncode中引入的『架构守护代码化』工具Guarding。不过呢,从时间点上来看,现在也不算太晚,笑。
2、Guarding是一个可以用于Java、JavaScript、Rust、Go等语言的架构守护工具。受ArchUnit的启发,借助于易于理解的DSL,来编写守护规则。支持Windows、macOS、GNU/Linux系统。
3、简单来说,就是我们可以使用一个易于阅读的DSL来编写架构规则。而这些个架构规则,可以用于主流的语言。如下是使用Guarding编写的规则示例:
4、package(".")::file.lenshould<200;
5、package(".")::file.lenshould>50;
6、class("java.util.Map")onlyaccessed(["com.phodal.pepper.refactor.staticclass"]);
7、class(implementation"BaseParser")::len=2
8、class(implementation"BaseParser")::nameshouldnotcontains"Lexer";
9、struct("..myapp..")::function.nameshouldcontains("Model");
10、struct("..myapp..")::function.namecontains("");
11、如果你熟悉ArchUnit的话,就能很快的上手Guarding的编写。当然了,还有很多语法还在开发中。
12、Guarding可以很支持中文。但是,我觉得这中英文模板切换就是个问题。
13、Guarding可以支持更多的语法,如针对于Rust或者Golang,class可以换成struct。
14、运行起Guarding也非常简单,只需要guarding.就可以了。
15、当然了,安装也非常简单,直接从GitHub下载:https://github.com/inherd/guarding。或者是,如果你有Rust的环境的话,那么你可以直接:cargoinstallguarding。
16、简单来说,Guarding的程序为三部分:
17、多语言解析器。使用Treesitter作为解析工具,配合S表达式进行解析。
18、在语言解析这事上吧,我又经历了一系列的尝试。
19、基于Antlr的标准语言解析。起先在设计Guarding的时候,我是打算使用类似于Coca的方式,基于Antlr官方维护的一个三方贡献的语法库。而对于我来说,这是一种旧的解析方式,所以我使用它的可能性不大。
20、基于Ctags的语法分析。另外一种选择是使用在设计Modeling的时候,引入的是Ctags。Ctags是一个用于从程序源代码树产生索引文件(或tag文件),从而便于文本编辑器来实现快速定位的实用工具。而使用Ctags需要引入二进制的包。于是,首先我尝试构建了ctags-sys,随后还需要编写ctags长长解析方式,时间成本有点高。
21、基于LSP的语法分析。我短暂的评估过采用LSP(LanguageServerProtocol)的方式,但是使用LSP意味着:引入更多的语言相关的依赖。所以,依旧是不可行的路线。
22、直至,在完善Uncode的一些设计时,发现有Tree-sitter能实现相关的功能。Tree-sitter早先是在Atom编辑器中引入的一个试验性功能。Tree-sitter支持Rust、JavaScript、Python、Ruby、Haskell语言。与Haskell和Ruby这种小众语言比,Rust这种小众语言也就还行,哈哈。不过,从性能上来说,是这里面性能最好的。
23、如下是一个简单的C++语言的Class示例:
24、TreeSitter会将上述的CPP代码解析成语法树(部分):
25、name:type_identifier[0,6]-[0,13]
26、body:field_declaration_list[0,14]-[4,1]
27、随后,我们就可以编写对应的查询(query)语法树S表达式(S-expression):
28、name:((type_identifier)@class-name)
29、S表达式会从语法树中区别到对应的节点,将节点信息赋给变量,如这里的@class-name。
30、你可以从TreeSitter官方提供的在线Playground尝试:https://tree-sitter.github.io/tree-sitter/playground
31、Guarding使用的是Rust语言开发的,由于之前已经用过了Lalrpop、Antlr等解析器,所以这次我们采用的解析器是:pest。虽然,我没有细究过,这几个不同的解析器在学术上的差距,我一般只会按需选择我用得少的。如下是guarding.pest的部分代码示例:
32、rule_level~("("~scope~")")?~(use_symbol~expression)?~should?~only?~operator~assert~";"?
33、在docs和examples里,有Guarding的语法开发过程中的记录和关键词信息。
34、值得一提的是包路径解析,所以我们的包解析方式参考的是ArchUnit的设计方式。
35、Guarding采用的是Rust语言,所以二进制是直接支持所有的主流操作系统。其次,我们采用的是CLI方式,因此可以在任何阶段中采用,如:
36、在本地结合GitHook进行代码预提交检查。
37、在持续集成阶段,配合流水线工作使用。
38、结合IDEA/编辑器插件进行实时检查(还没有实现)。
39、当然了,这个是适用于单个团队的处理方式。对于更大规模的团队来说,可以采用:
40、模板继承的方式(当然,还没有实现)
41、欢迎加入Guarding的开发:https://github.com/inherd/guarding
关于guarding的的内容到此结束,希望对大家有所帮助。