Skyway定製程式碼產生器

password318發表於2010-08-13

SkywayBuilder的核心就是Skyway產生框架(Generation Framework)。我們基於Eclipse引擎的產生框架提供了可擴充套件的程式碼產生功能,和scaffolding能力。Skyway程式碼產生框架使用XML模型(尤其是EMF)作為輸入,併產生檔案和工件(artifacts)。最近,在我們提供的標準程式碼產生和scaffolding之外,我們看到催生出大量的使用Skyway產生框架,並根據他們企業自己的技術需求建立出的客戶化的產生平臺。在Jack提交的Blog日誌“Top 10 Principles of Code Generation ”認為,擴充套件性(extensibility)是關鍵。我們相信一個好的程式碼產生系統必須是可擴充套件的(extendible),可配置的(configurable),和在每個level都能進行自定義(Customizable).這一系列的blog是對Skyway的擴充套件架構進行更深入地回顧,並描述了我們的自定義程式碼生成處理的能力。

 

 

 

Skyway Generation Framework

 

Skyway產生框架能被用來產生人呢一型別的文字檔案。產生處理能被顯示地通過一個JavaAPI執行或者配置為自動執行,當一個模型通過EclipseBuilder對模型進行改變的時候,相應的程式碼就會自動生成。目前,產生引擎執行在EclipseIDE的內部,但是正計劃允許headless execution

框架以工件集(artifacts sets)為核心,它由工件定義(artifacts definision),發射(emitters)和無效器(invalidator)組成。由於工件集被鏈到Eclipse的門面facets上,因此,他們可以很容易地從一個模型專案中被部署或者移除。這個模型專案允許開發者從同一個應用程式模型中產生不同的程式碼版本。

 

一個工件定義描述了一個工件,並由一個模板(template),一個產生器(generator),一個美化器(beautifier)和一個整合器(merger)組成。

 

 

  • template 是工件的設計藍圖
  • generator 使用模板建立該工件,由於產生器是可插拔的,框架不會與任何特定的模板技術相耦合,JETVelocity 是常用的兩種融合技術,你可以對一些工件使用JET,對另一些工件使用velocity
  • beautifier 用來清理產生的檔案。通過使用一個美化器,模板作者無需為Java,XML文件的縮排,模組配對美化問題而擔心
  • merger 用來解決當產生的檔案必須融合另一個版本的同樣檔案時的問題。一個merger允許使用者修改一個產生的文件,當使用者對文件進行重新生成時,這些修改將不會被覆蓋。來自EMF的JMerger,被用來對Java原始碼檔案進行處理,但是其他merger可被書寫並被插入。JMerger由一個規則檔案控制,SkywayBuiler的stock工件集是一個定義了這些規則檔案的工件,因此它被產生於每個專案中。這些檔案可以非常容易被訪問到和暴露出來,因此這些Java merging規則能夠根據特定的情況進行調整

 

所有的Skyway模板使用JET開發,org.skyway.integration.java 外掛提供了許多客戶化的JET標籤(Tags),大大擴充了JET框架提供的那些基礎標籤。這些標籤封裝了可重用的Java程式碼片段。例如,當一個Java丟擲語句塊的時候,可以使用ThrowsListTag,當需要Java包語句的時候,可以使用PackageTag標籤。只要你不擴充套件SkywayJET模板,Skyway的JET標籤庫能獨立於產生程式碼框架執行。

我們的JET標籤大量使用發射器(emitter),發射器是一些小的程式碼,它知道如何來發出一些常用的字串。發射器不與JET耦合,這樣就允許你將他們使用在其他的模板框架中,或者是非程式碼產生器裡。當然,發射器是可插拔的,也可被複寫。

 

產生的作用範圍(scope)是由invalidator控制的。一個invalidator可以讓一個模型改變的時候讓另一個模型變髒(dirty)的方式。例如,你可能希望在你改變資料庫設定的時候,重新生成所有的資料物件。對於這些常見的情況,例如,使專案變髒,我們提供了stock invalidator。

 

 

 

Extending the Framework

 

Skyway產生框架是非常可擴充套件的,通過使用Java,它能被定製為大量的不同用途。當試圖構架一個新的產生框架時,許多使用者從一個現有的工件集開始,這些工件集他們需要在某種程度上進行修改,並允許使用現存的模板以節省大量時間。例如,使用者希望產生基於Spring的web應用程式,可以通過從Skyway的工件集開始,然後定製Skyway模板以滿足他們自己的特定需求。(我們的開源專案和商業版本Skyway Builder 就是這麼做的)

 

對於使用者選擇修改一個現有工件集,在SkywayBuilder中有4中通用方法來完成此事。

 

 

  • 新增,移除或複寫一個工件的定義
  • 新增或複寫一個發射器
  • 新增或複寫一個無效器
  • Scaffolding

我下面的一些Blog將對上述4中方法進行詳細地表述。

也可以建立一個完全新的工件集,並將他與我們的門面耦合。如果你選擇建立你自己的工件集,你將建立你自己的Eclipse門面並將他鏈到新的工件定義。你可能選擇使用現存的Skyway應用程式模型(在EMF中),或你可能建立一個你自己的支撐模型(backing model).如果你使用我們的應用程式模型,你可以繼續使用我們的使用者介面優勢,即便你選擇建立你自己的工具集,你仍能從一些現存的Skyway元件獲益來產生(generation),來融合(merging),來美化(beautifcation).

 

Summary

 

檢視更多關於Skyway擴充套件架構的日誌,和我們對於客戶化程式碼處理的能力,將在隨後幾周提交。在此你可以通過這個連結,下載或者檢出SkywayBuilder 原始碼

 

 

 

這裡再提供一個視訊資源:QuickStartForSpringMVC Scaffolding

相關文章