您的位置 首页 > 德语词汇

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

大家好,今天来为大家解答guarding的这个问题的一些问题点,包括Guarding:开源的多语言架构守护工具也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

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

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

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

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的的内容到此结束,希望对大家有所帮助。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023