成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Guarding:開源的多語言架構守護工具

開源
Guarding 是一個可以用于 Java、JavaScript、Rust、Go 等語言的架構守護工具。受 ArchUnit 的啟發,借助于易于理解的 DSL,來編寫守護規則。

[[408185]]

Guarding 簡介

Guarding 是一個可以用于 Java、JavaScript、Rust、Go 等語言的架構守護工具。受 ArchUnit 的啟發,借助于易于理解的 DSL,來編寫守護規則。支持 Windows、macOS、GNU/Linux 系統。

使用

簡單來說,就是我們可以使用一個易于閱讀的 DSL 來編寫架構規則。而這些個架構規則,可以用于主流的語言。如下是使用 Guarding 編寫的規則示例:

  1. package(".")::file.len should < 200; 
  2. package(".")::file.len should > 50; 
  3.  
  4. class("java.util.Map"only accessed(["com.phodal.pepper.refactor.staticclass"]); 
  5. class(implementation "BaseParser")::len = 2 
  6. class(implementation "BaseParser")::name should not contains "Lexer"
  7.  
  8. struct("..myapp..")::function.name should contains("Model"); 
  9. 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

  1. 簡單來說,Guarding 的程序為三部分:
  2. Guarding 規則解析器。
  3. 多語言解析器。使用 Treesitter 作為解析工具,配合 S 表達式進行解析。

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 示例:

  1. class MyClass { 
  2. public
  3. int myNum; 
  4. string myString; 
  5. }; 

TreeSitter 會將上述的 CPP 代碼解析成語法樹 (部分):

  1. translation_unit [0, 0] - [6, 0] 
  2. class_specifier [0, 0] - [4, 1] 
  3. name: type_identifier [0, 6] - [0, 13] 
  4. body: field_declaration_list [0, 14] - [4, 1] 
  5. access_specifier [1, 2] - [1, 9] 

隨后,我們就可以編寫對應的查詢(query)語法樹 S 表達式(S-expression):

  1. (class_specifier 
  2. 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 的部分代碼示例:

  1. normal_rule = { 
  2. rule_level ~ ("(" ~ scope ~ ")")? ~ (use_symbol ~ expression)? ~ should? ~ only? ~ operator ~ assert ~ ";"
  3.  
  4. rule_level = { 
  5. "package" | 
  6. "class" | 
  7. "struct" | 
  8. "function" | 
  9. "file" 

在 docs 和 examples 里,有 Guarding 的語法開發過程中的記錄和關鍵詞信息。

包路徑解析

值得一提的是包路徑解析,所以我們的包解析方式參考的是 ArchUnit 的設計方式。

如何使用 Guarding 進行架構守護

Guarding 采用的是 Rust 語言,所以二進制是直接支持所有的主流操作系統。其次,我們采用的是 CLI 方式,因此可以在任何階段中采用,如:

  • 在本地結合 Git Hook 進行代碼預提交檢查。
  • 在持續集成階段,配合流水線工作使用。
  • 結合 IDEA / 編輯器插件進行實時檢查(還沒有實現)。

當然了,這個是適用于單個團隊的處理方式。對于更大規模的團隊來說,可以采用:

  1. 模板繼承的方式(當然,還沒有實現)

其它

歡迎加入 Guarding 的開發:https://github.com/inherd/guarding

本文轉載自微信公眾號「phodal」,可以通過以下二維碼關注。轉載本文請聯系phodal公眾號。

 

責任編輯:武曉燕 來源: phodal
相關推薦

2014-07-09 09:20:06

WPFWPF應用

2014-04-16 14:50:20

Spark

2011-08-05 17:54:33

Cocoa Touch 多語言

2012-04-19 11:40:21

Titanium

2009-08-25 10:44:50

C#實現多語言

2025-05-22 05:00:00

2021-09-07 10:17:35

iOS多語言適配設計

2024-05-09 08:14:09

系統設計語言多語言

2023-10-18 15:21:23

2022-08-09 07:22:15

語言數據庫程序

2009-07-17 10:02:29

WPF程序多語言支持

2024-03-04 14:15:16

OpenAI語言嵌入模型

2023-08-04 10:18:15

2020-04-14 09:50:02

2009-08-31 17:13:09

2019-12-05 16:00:15

Vim插件編程文本編輯器

2009-08-03 17:33:01

ASP.NET多語言支

2021-07-24 11:41:42

前端開發技術

2009-06-15 15:33:13

ScalaTwitter

2024-02-26 16:36:48

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线视频99 | 国产婷婷精品av在线 | 老子午夜影院 | 亚洲精品国产成人 | 91欧美激情一区二区三区成人 | 欧美久久久久久久久 | 国产成人精品一区二 | 成人免费影院 | 亚洲综合大片69999 | 午夜精品视频 | 一级女毛片 | 91精品久久久 | 日操夜操 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 亚洲一区国产精品 | 一级a性色生活片久久毛片波多野 | 久久影音先锋 | 日本不卡一二三 | 国产精品国产a级 | 久久精品亚洲精品 | 超碰日本 | 亚洲国产精品成人无久久精品 | 国产精品日日夜夜 | 羞羞视频免费观看入口 | 国产伦精品一区二区三区照片91 | 亚洲精品福利视频 | 在线观看av免费 | 黄网站在线观看 | 国产精品久久久久久一区二区三区 | 国产成人精品一区二区三区在线观看 | 老外黄色一级片 | 成人在线免费视频 | 亚洲一区二区三区免费观看 | 午夜资源 | 欧产日产国产精品99 | 成人性生交大片免费看中文带字幕 | 日韩国产欧美一区 | 99久久精品国产一区二区三区 | 综合久久综合久久 | 日韩欧美亚洲 | 毛片的网址 |