開始使用定義域專屬語言
發行︰ 2016年7月
如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件。
本主題說明在定義和使用適用於 Visual Studio Modeling SDK 所建立的定義域專屬語言 (DSL) 的基本概念。
如果您不熟悉 dsl,建議您逐步DSL 工具實驗室,您可以在這個網站中找到︰ Visualizaton and Modeling SDK
您可以使用定義域專屬語言做什麼?
定義域專屬語言是標記法,通常是圖形,是設計用來為特定的用途。 相較之下,例如 UML 的語言是一般用途。 在 DSL 中,您可以定義類型的模型項目和其關聯性,以及在螢幕上的呈現方式。
當您設計 DSL 時,您可以將它做為 Visual Studio 整合擴充功能 (VSIX) 封裝的一部分。 使用者在使用中的 DSL Visual Studio:
表示法是非負數的 DSL 的組件。 這個標記法,VSIX 套件包含工具,使用者就可以套用,幫助他們編輯並產生其模型的內容。
其中一個主要的應用程式的 Dsl 是產生的程式碼、 組態檔和其他成品。 尤其是在大型專案和產品線,其中將建立一項產品的數個變化,從 Dsl 產生許多變動層面可以提供大幅增加可靠性和需求的變更非常快速的回應中。
本概觀的其餘部分則介紹建立和使用中的網域特定語言的基本作業的逐步解說Visual Studio。
必要條件
若要定義 DSL,您必須已安裝下列元件:
Visual Studio | https://go.microsoft.com/fwlink/?LinkId=185579 |
Visual Studio SDK | https://go.microsoft.com/fwlink/?LinkId=185580 |
Modeling SDK for Visual Studio | 下載 MSDK |
建立 DSL 方案
若要建立新的定義域專屬語言,您建立新Visual Studio方案使用定義域專屬語言專案範本。
建立 DSL 方案
在 [檔案] 功能表中,指向 [新增] ,然後按一下 [專案] 。
在專案類型,依序展開其他專案類型節點,然後按一下 [擴充性。
按一下 [定義域專屬語言設計工具。
![建立 DSL] 對話方塊](../Image/Create_DSLDialog.png "Create_DSLDialog")
在名稱方塊中,輸入FamilyTree。 按一下 [確定]。
定義域專屬語言精靈隨即開啟,並顯示範本 DSL 方案清單。
按一下每個範本的描述,
範本可起始點。 每個提供完整的工作 DSL,您可以加以編輯以符合您的需求。 一般而言,您會選擇最接近您要建立範本。
此逐步解說中,選擇 [最小語言範本。
在適當的精靈頁面中輸入 DSL 的副檔名。 這是包含 DSL 將使用之執行個體的檔案的副檔名。
選擇不在您的電腦,或您要安裝 DSL 的任何電腦中的任何應用程式相關聯的擴充功能。 例如, docx和htm是無法接受的檔案名稱的副檔名。
如果您已輸入的副檔名正用來做為 DSL,精靈將會警告您。 請考慮使用不同的副檔名。 您也可以重設 Visual Studio SDK Experimental 執行個體以清除舊的實驗設計工具。 按一下 [啟動,按一下 [所有程式, Microsoft Visual Studio 2010 SDK,工具,然後重設 Microsoft Visual Studio 2010 實驗執行個體。
檢查其他頁面,然後按一下 [完成。
產生的方案包含兩個專案。 Dsl 和 DslPackage 種命名。 圖表檔案,也就是開啟具名的 DslDefinition.dsl。
注意
從 DslDefinition.dsl 產生大多數的程式碼,您可以看到兩個專案中的資料夾中。 基於這個理由,大部分您的 DSL 來修改此檔案中。
這時使用者介面類似以下圖片。
此方案定義網域指定的語言。 如需詳細資訊,請參閱定義域專屬語言工具使用者介面的概觀。
DSL 方案的重要部分
請注意下列各方面的新方案。
Dsl\DslDefinition.dsl這是您會看到當您建立 DSL 方案的檔案。 方案中幾乎所有的程式碼會產生這個檔案,及此處所做的大部分您對 DSL 定義的變更。 如需詳細資訊,請參閱使用使用 DSL 定義圖。
Dsl 專案這個專案會包含定義網域特定語言的程式碼。
在 DslPackage 專案此專案包含允許的開啟和編輯在 DSL 執行個體的程式碼Visual Studio。
執行 DSL
在建立時,您可以執行 DSL 方案。 稍後,您可以修改 DSL 定義逐漸,在每次變更之後,再次執行方案。
若要試驗 DSL
按一下 [轉換所有範本[方案總管] 工具列。 這會重新產生大部分的 DslDefinition.dsl 的原始程式碼。
注意
每當您變更 DslDefinition.dsl,您必須按一下轉換所有範本重新建置方案之前。 您可以自動化此步驟。 如需詳細資訊,請參閱如何自動化轉換的所有範本。
按下 F5,或在偵錯] 功能表上,按一下 [開始偵錯。
DSL 組建和已安裝在實驗執行個體Visual Studio。
Visual Studio 的實驗執行個體隨即啟動。 會從個別的子樹的登錄,其設定的實驗執行個體執行所在Visual Studio延伸都已登錄的偵錯之用。 一般的執行個體Visual Studio不能那里註冊擴充功能的存取。
在實驗性執行個體Visual Studio,開啟模型檔案,名為測試從方案總管] 中。
-或-
偵錯專案上按一下滑鼠右鍵,指向新增,然後按一下 [項目。 在加入項目對話方塊中,選取該檔案類型的 DSL。
模型檔案開啟為空白的圖表。
工具箱] 中開啟,並顯示適用於圖表類型的工具。
使用工具來建立圖表上的圖形和連接器。
若要建立圖形,拖曳到圖表的範例圖形工具。
若要連接兩個圖形,按一下範例連接器工具,按一下第一個圖形,,然後按一下第二個圖形。
按一下 [變更形狀的標籤。
實驗Visual Studio會類似下列的範例︰
模型的內容
DSL 的執行個體檔案的內容會呼叫模型。 模型包含模型元素和連結項目之間。 DSL 定義中指定的模型項目類型,可以存在於模型中的連結。 例如,在最小語言範本所建立的 DSL,沒有一種類型的模型項目,以及一種類型的連結。
DSL 定義可以指定模型圖上顯示的方式。 您可以選擇各式各樣的圖形和連接器的樣式。 您可以指定某些圖形出現在其他圖形。
您可以在樹狀結構檢視模型總管檢視您正在編輯模型。 將圖形新增到圖表時,模型項目也會出現在 [總管] 中。 即使沒有任何圖表,可用 [總管] 中。
如果您無法看到 [總管] 中的偵錯的執行個體Visual Studio上檢視] 功能表中的指向其他視窗,然後按一下 [ * > * 總管。
您的 DSL 的 API
您的 DSL 會產生一個 API,讓您讀取和更新模型的 DSL 執行個體。 API 的一個應用程式會從模型產生文字檔案。 如需詳細資訊,請參閱設計階段使用 T4 文字範本產生程式碼。
在偵錯方案中,開啟範本檔案具有副檔名".tt"。 這些範例會示範如何從模型中,產生的文字,並讓您測試您的 DSL 的 API。 其中一個範例以撰寫Visual Basic、 在其他Visual C#。
在每個範本檔案會是它所產生的檔案。 依序展開 [方案總管] 中的範本檔案,並開啟產生的檔案。
範本檔案包含簡短列出模型中的所有項目的程式碼區段。
產生的檔案包含的結果。
當您變更模型檔案時,您會看到產生的檔案中對應的變更之後重新產生的檔案。
若要重新產生文字檔案之後變更的模型檔案
在實驗性執行個體Visual Studio,儲存模型檔案。
請確定檔案名稱參數,每個.tt 檔案中的是指您用於實驗的模型檔案。 儲存.tt 檔案。
按一下 [轉換所有範本的工具列中的方案總管] 中。
-或-
以滑鼠右鍵按一下您想要重新產生,然後按一下 [範本執行自訂工具。
您可以將任何數目的文字範本檔加入專案。 每個範本會產生一個結果檔案。
注意
當您變更 DSL 定義中時,範例文字範本程式碼將無法運作,除非您加以更新。
如需詳細資訊,請參閱定義域專屬語言產生程式碼和用來自訂網域特定語言撰寫程式碼。
自訂 DSL
當您想要修改 DSL 定義中時,關閉此實驗執行個體,並更新主定義Visual Studio執行個體。
注意
您已修改 DSL 定義之後,您可能會遺失您建立使用較早版本的測試模型中的資訊。 例如,偵錯方案包含名為範例,其中包含一些圖形和連接器的檔案。 您開始開發您的 DSL 定義之後,將不會顯示,並將會遺失您儲存檔案時。
您可以將各種不同的擴充功能對您的 DSL。 下列範例會提供您各種可能性的印象。
每個變更後,儲存 DSL 定義中,按一下 [轉換所有範本中方案總管] 中,然後按下F5試驗變更 DSL。
重新命名類型和工具
重新命名現有的網域類別和關聯性。 例如,從最小語言範本所建立的 Dsl 定義開始,您就可以執行下列重新命名作業,以便代表家庭樹狀結構的 DSL。
若要重新命名網域類別、 關聯和工具
DslDefinition 圖表中,在重新命名ExampleModel至FamilyTreeModel, ExampleElement至人,目標至父系,和來源至子系。 您可以按一下每一個標籤加以變更。
重新命名的項目和連接器工具。
按一下 [方案總管] 索引標籤中開啟 [DSL 總管] 視窗。 如果您無法看到它,在檢視] 功能表中的指向其他視窗然後按一下 [ DSL Explorer。 DSL 總管] DSL 定義圖是使用中視窗時,才是可見。
開啟 [屬性] 視窗,它定位好,您可以同時看到 DSL 總管和屬性。
在 [DSL 總管] 中,展開編輯器,工具箱索引標籤, * > ,然後工具*。
按一下 [ ExampleElement。 這是用來建立項目的工具箱項目。
在 [屬性] 視窗中,變更名稱屬性人。
請注意,標題屬性也會變更。
同樣地,在變更名稱ExampleConnector工具ParentLink。 Alter標題屬性,因此它不是一份名稱屬性。 例如,輸入父連結。
重建 DSL。
儲存 DSL 定義檔案。
按一下 [轉換所有範本在方案總管] 的工具列
按 F5。 等到實驗執行個體Visual Studio隨即出現。
偵錯方案中的實驗執行個體Visual Studio,開啟測試模型檔案。 項目從 [工具箱] 拖曳至它。 請注意,已變更的工具的標題和 DSL 總管] 中的型別名稱。
儲存模型檔案。
開啟.tt 檔案,並使用新的名稱來取代舊的型別和屬性名稱的項目。
請確定.tt 檔案中指定的檔案名稱指定測試模型。
儲存.tt 檔案。 開啟產生的檔案,請參閱.tt 檔案中執行程式碼的結果。 確認正確。
將網域屬性加入類別
將屬性加入至網域類別,例如若要表示的出生年份和死亡的人員。
若要顯示新的屬性在圖表上,您必須新增裝飾項目圖形以顯示模型項目。 您也必須對應屬性來裝飾項目。
若要新增內容,並加以顯示
加入屬性。
在 DSL 定義圖表中,以滑鼠右鍵按一下人網域類別,指向新增,然後按一下 [網域屬性。
輸入新的屬性名稱的清單,例如生日和死亡。 按下Enter之後每一個。
將裝飾項目,會顯示在圖形中的屬性。
請遵循從 Person 網域類別延伸到圖表的另一端的灰線。 這是圖表項目對應。 它的網域類別連結圖形類別。
此圖形類別上按一下滑鼠右鍵,指向新增,然後按一下 [文字裝飾項目。
將裝飾名稱的兩個項目,例如BirthDecorator和DeathDecorator。
選取每個新的裝飾項目,然後在 [屬性] 視窗中,設定位置欄位。 這會決定網域屬性值顯示在圖形上的位置。 例如,設定InnerBottomLeft和InnerBottomRight。
將裝飾項目對應至屬性。
開啟 [DSL 詳細資料] 視窗。 它通常是在索引標籤旁邊的 [輸出] 視窗。 如果您無法看到它,在檢視功能表上,指向其他視窗,然後按一下 [ DSL 詳細資料。
在 DSL 定義圖表中,按一下 [連接的線條人圖形類別的網域類別。
在DSL 詳細資料上裝飾項目對應索引標籤上,按一下 [未對應的裝飾項目] 核取方塊。 在顯示屬性,選取您要它對應的網域屬性。 例如,對應BirthDecorator至生日。
儲存 DSL 中,按一下 [轉換所有範本,然後按 F5。
在範例模型圖中,確認您可以現在按一下您所選擇的位置並輸入值。 此外,當您選取人圖形,[屬性] 視窗會顯示生日及死亡的新屬性。
在.tt 檔案,您可以加入程式碼會取得每個人的內容。
定義新類別
您可以加入網域類別和關聯性的模型。 例如,您可以建立新的類別來代表城鎮,以及新的關聯性來代表人員存留現身。
若要讓模型圖表上不同的類型不同,您可以在各種不同的圖形,或使用不同的幾何和色彩的圖案對應網域類別。
若要新增和顯示新的網域類別
網域類別,並讓模型根的子系。
在 DSL 定義圖表中,按一下 [內嵌關聯性工具,請按一下 [根類別FamilyTreeModel,然後按一下圖表的空白部分。
新的網域類別,會出現,連接到內嵌關聯性與 FamilyTreeModel。
將它的名稱,例如城鎮。
注意
模型的根以外的每個網域類別必須至少一個內嵌關聯性的目標,或必須繼承自的類別,做為目標的內嵌。 基於這個理由,就經常方便使用的內嵌關聯性工具來建立網域類別。
將網域屬性加入至新的類別,例如名稱。
新增人員與城市之間的參考關聯性。
按一下 [參考關聯性工具中,按一下收件者,然後按一下 [城鎮。
注意
參考關聯性表示從模型樹狀結構的一部分到另一部分的交互參照。
新增圖形以代表城鎮模型圖表上。
拖放到幾何圖形從工具箱拖曳至圖表,並重新命名,例如TownShape。
在 [屬性] 視窗中,會將新的圖形,例如填滿色彩和幾何的外觀欄位。
加入顯示的城鎮名稱裝飾項目,並將它重新命名 NameDecorator。 設定它的位置屬性。
將城鎮網域類別對應至 TownShape。
按一下 [圖表項目對應工具,然後按一下 [城鎮網域類別,然後再 TownShape 圖形類別。
在裝飾項目對應] 索引標籤的DSL 詳細資料選取視窗與對應的連接器,請 NameDecorator,並設定顯示屬性名稱。
建立連接器,以顯示個人和城鎮之間的關係。
將連接器從 [工具箱] 拖曳至圖表。 將它重新命名,並設定其外觀屬性。
使用圖表項目對應工具城鎮人員之間的關聯性連結新的連接器。
建立項目工具進行新市鎮。
在DSL Explorer,依序展開編輯器然後工具箱索引標籤。
以滑鼠右鍵按一下* > 然後按一下 [加入新項目工具*。
設定名稱屬性與新的工具,並設定其類別城鎮的屬性。
設定工具箱圖示屬性。 Click [...]和檔案名稱欄位中,選取圖示檔。
建立連接器工具進行城鎮與人之間的連結。
以滑鼠右鍵按一下* > 然後按一下 [加入新的連接器工具*。
設定新工具的名稱屬性。
在ConnectionBuilder屬性中,選取包含人與鄉鎮的關聯性的名稱產生器。
設定工具箱圖示。
儲存 DSL 定義中,按一下 [轉換所有範本,然後按下F5。
在實驗性執行個體Visual Studio,開啟測試模型檔案。 使用新的工具來建立城鎮和城鎮與人員之間的連結。 請注意,您可以只建立正確類型的項目之間的連結。
建立會列出的城鎮中存在的每個人的程式碼。 文字範本是您可以在其中執行這類程式碼的地方。 例如,您可以修改偵錯方案中現有的 Sample.tt 檔案,使其包含下列程式碼︰
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" debug="true" #> <#@ output extension=".txt" #> <#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Sample.ftree'" #> <# foreach (Person person in this.FamilyTreeModel.People) { #> <#= person.Name #><#if (person.Town != null) {#> of <#= person.Town.Name #> <#}#> <# foreach (Person child in person.Children) { #> <#= child.Name #> <# } } #>
當您儲存 *.tt 檔案時,它會建立包含清單的成員和其 residences 的附帶檔案。 如需詳細資訊,請參閱定義域專屬語言產生程式碼。
驗證和命令
您可以開發進一步這個 DSL 加入驗證條件約束。 這些條件約束是方法,您可以定義,請確定模型處於正確狀態。 例如,您可以定義條件約束,確保的孩子的出生日期晚於其父代的。 如果 DSL 使用者嘗試儲存會中斷任何條件約束的模型驗證功能會顯示警告。 如需詳細資訊,請參閱驗證定義域專屬語言。
您也可以定義使用者可以叫用的功能表命令。 命令可以修改模型。 也可以與其他模型中互動Visual Studio與外部資源。 如需詳細資訊,請參閱如何︰ 修改標準功能表命令。
部署 DSL
若要允許其他使用者使用定義域專屬語言,您將發佈Visual Studio擴充功能 (VSIX) 檔案。 這會建立當您建置 DSL 方案。
您的方案的 bin 資料夾中找到.vsix 檔案。 將它複製到您要安裝的電腦。 在安裝程式,請按兩下 VSIX 檔案。 中的所有執行個體可用 DSLVisual Studio該電腦上。
您可以使用相同的程序,讓您不必使用實驗性執行個體,您自己電腦上安裝 DSL Visual Studio。
如需詳細資訊,請參閱部署網域指定的語言方案。
移除舊的實驗 Dsl
如果您建立實驗的 Dsl,您不再需要,您可以從您的電腦中移除它們,重設Visual Studio實驗執行個體。
這會從電腦移除所有實驗 Dsl 和其他實驗性Visual Studio延伸模組。 這些是已在偵錯模式執行的擴充功能。
此程序不會移除 Dsl 或其他Visual Studio完整安裝執行 VSIX 檔案的副檔名。
若要重設的 Visual Studio 實驗執行個體
按一下 [啟動,按一下 [所有程式, Microsoft Visual Studio 2010 SDK,工具,然後重設 Microsoft Visual Studio 2010 實驗執行個體。
重建任何實驗 Dsl 或其他實驗Visual Studio要使用的擴充功能。