建置流程中的程式碼產生
您可以叫用文字轉換做為 Visual Studio 方案建置流程的一部分。這麼做可以確定從範本產生的檔案是最新的,然後再進行編譯。如此一來,您就可以避免發生使用者在建置專案或簽入程式碼之前忘記按下 [轉換所有範本] 的情形。文字轉換工作可以由 Visual Studio 或 MSBuild 在組建伺服器上執行。
在專案檔中加入文字轉換工作
安裝 Visualization and Modeling SDK
若要在開發電腦上啟用建置工作,請安裝 Visual Studio Visualization and Modeling SDK (英文)。
若要在組建伺服器上啟用建置工作,請參閱組建伺服器上的文字轉換。
編輯專案檔
若要叫用文字轉換,您必須編輯定義專案的檔案。這些屬性無法在專案屬性編輯器中編輯。因此,您必須關閉專案,然後將它當做文字檔來編輯。
若要編輯專案檔的文字
在 [方案總管] 中,以滑鼠右鍵按一下專案,然後按一下 [卸載專案]。
以滑鼠右鍵再按一下專案,然後按一下 [編輯project]。
專案檔的文字隨即顯示在 XML 編輯器中。
若要在完成編輯時重新開啟專案
關閉 XML 編輯器。
在 [方案總管] 中,以滑鼠右鍵按一下專案,然後按一下 [重新載入專案]。
匯入文字轉換目標
文字轉換建置工作是在單一檔案中定義的。您必須在設定標準 C# 或 Visual Basic 目標之後將它匯入。
若要匯入文字轉換目標
在檔案中搜尋類似下列其中一行的內容:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-或-
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
在那一行之後,插入文字範本化匯入:
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v11.0\Microsoft.TextTemplating.targets" />
設定可控制建置執行方式的屬性
將下列文字插入至專案檔。如需其他可插入此屬性群組的屬性,請參閱下列章節。
<PropertyGroup>
<TransformOnBuild>true</TransformOnBuild>
<!-- Other properties can be inserted here -->
</PropertyGroup>
TransformOnBuild 會在您建置專案時,促使執行專案中所有的範本。
叫用轉換
轉換專案組建中的所有範本
如果您在專案檔中加入下列屬性,則每當建置專案時,都會受到累加建置功能的影響而執行專案中所有的文字範本。
<TransformOnBuild>true</TransformOnBuild>
您可以在 Visual Studio 中按 F5 或使用 MSBuild 來叫用轉換。例如:
msbuild myproject.csproj
如果略過 TransformOnBuild 或將它設為 false,範本就不會成為專案建置中需要自動轉換的部分。
加入參考路徑
您可以加入一組路徑,讓主應用程式用來尋找範本所參考的組件。例如:
<ItemGroup>
<!-- Add VS\...\PublicAssemblies to the list of places
to look for assemblies used by templates. -->
<T4ReferencePath Include="$(VsIdePath)PublicAssemblies\" />
</ItemGroup>
轉換特定範本
您可以透過 msbuild 公用程式叫用 Transform 工作來轉換指定的檔案。這項工作未相依於 TransformOnBuild 屬性,也不會編譯專案檔。您必須匯入文字範本化目標,如之前章節所述。
例如,轉換特定檔案:
msbuild myproj.proj /t:Transform /p:TransformFile=MyTemplate.tt
您也可以在 TransformFile 參數中使用萬用字元。例如,下列命令會轉換 GeneratedCode 資料夾底下所有的 .tt 檔案:
msbuild dsl.csproj /t:Transform /p:TransformFile="GeneratedCode\**\*.tt"
累加建置
根據預設,如果範本的輸出檔是最新的,組建管理員會嘗試避免執行該範本。為達成此目的,它會監視檔案系統以檢查範本程式碼讀取了哪些檔案。接下來,則會比較這些檔案的修改日期與輸出檔的日期。如果有任何輸入檔的修改日期比輸出檔日期還要晚,就執行範本。如果沒有之前執行此範本的相關資訊,也會執行該範本。
因此,如果輸出檔比下列任何檔案還舊,將會重新產生該輸出檔:
文字範本檔
<#@include#> 指示詞中指定的檔案
範本中程式碼所讀取的檔案
範本中使用之指示詞處理器所讀取或包含的檔案
如果您想要確保會在每個組建中執行所有的範本,請插入以下屬性:
<TransformOutOfDateOnly>false</TransformOutOfDateOnly>
原始檔控制
與原始檔控制系統的特定內建整合並未提供。但是您可以加入自己的擴充項目,例如簽出和簽入已產生的檔案。
根據預設,文字轉換工作會避免覆寫標記為唯讀的檔案,一旦遇到這樣的檔案時,就會在 Visual Studio 錯誤清單中記錄錯誤,而且工作會失敗。
若要指定必須覆寫唯讀檔案,請插入以下屬性:
<OverwriteReadOnlyOuputFiles>true</OverwriteReadOnlyOuputFiles>
除非您自訂後置處理步驟,否則覆寫檔案時就會將警告記錄於錯誤清單中。
自訂建置流程
您可以自訂建置流程,例如簽出已遭覆寫的檔案。系統提供了兩個自訂點,轉換之前和之後會分別呼叫這兩個點。
若要定義這些自訂點,請定義屬性 $(BeforeTransform) 和 $(AfterTransform)。
例如:
<PropertyGroup>
<BeforeTransform>CustomPreTransform</BeforeTransform>
<AfterTransform>CustomPostTransform;$(AfterTransform)</AfterTransform>
</PropertyGroup>
<Target Name="CustomPreTransform">
<Message Text="In CustomPreTransform..." Importance="High" />
</Target>
<Target Name="CustomPostTransform">
<Message Text="In CustomPostTransform..." Importance="High" />
</Target>
在 AfterTransform 中,可以參考下列清單:
GeneratedFiles:流程所寫入之檔案的清單。對於已覆寫現有唯讀檔的檔案而言,%(GeneratedFiles.ReadOnlyFileOverwritten) 將會是 true。您可以從原始檔控制中簽出這些檔案。
NonGeneratedFiles:不會遭到覆寫之唯讀檔案的清單。
例如,您可以使用這些清單來簽出遭覆寫的檔案。
組建伺服器上的文字轉換
如果組建伺服器執行所在的電腦未安裝 Visual Studio,您應該從已安裝 Visual Studio SDK 的電腦將下列檔案複製到組建電腦:
\Program Files\Microsoft Visual Studio 2010 SDK\VisualStudioIntegration\Common\Assemblies\v4.0\
Microsoft.VisualStudio.TextTemplating.11.0.dll
Microsoft.VisualStudio.TextTemplating.Interfaces.11.0.dll
Microsoft.VisualStudio.TextTemplating.VSHost.11.0.dll
\Program Files\MSBuild\Microsoft\VisualStudio\TextTemplating\v11.0\
- Microsoft.VisualStudio.TextTemplating.Sdk.Host.11.0.dll
\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\PublicAssemblies\
- Microsoft.VisualStudio.TextTemplating.Modeling.11.0.dll
如需詳細資訊,請參閱部署和設定組建控制器。