ASP.NET – Kết hợp XDT Transform và T4 Text Template để tạo các file .config

globe-tools-settingsThông thường để deploy một web project với từng môi trường khác nhau bạn thường tạo các Config Transform cho web.config và dùng chức năng Publish của Visual Studio. Tuy nhiên việc deploy của bạn có thể không đơn giản như thế, và bạn đang phải tạo cũng như đồng bộ một loạt các file config transform một cách thủ công. Nếu vậy, bài viết này có thể là một giải pháp giúp bạn thoát khỏi công việc buồn chán và rủi ro này.

Trước khi bắt đầu, bạn cần biết được cách sử dụng các cú pháp sử dụng trong Web.config Transformation, cũng như T4 Text Template.
Sau đó bạn cần cài đặt package Microsoft Xml Document Transformation từ nuget vào project:

PM> Install-Package Microsoft.Web.Xdt

Sau đó bạn tạo một thư mục để chứa các file config, ví dụ như DeploymentConfig. Bên trong thư mục này, bạn thêm một file Text Template (Add New Item > Visual C# > General) có tên ConfigGenerator.tt. Đây là file chúng ta sẽ viết code để tạo ra các file web.config transform.

Cấu trúc thư mục của tôi sẽ có dạng như sau (hai file Web.LOCAL.config và Web.PRODUCTION.config sẽ được sinh ra từ file ConfigGenerator.tt nên bạn chưa cần quan tâm đến chúng):

DeploymentConfig-folder-structure

Tôi tạo hai môi trường LOCAL và PRODUCTION tương ứng với hai file Local.config và Production.config trong thư mục Transforms. Bạn có thể hiểu được mối quan hệ của các file này sau khi xem hình dưới đây:

XDT-T4-TextTemplte-ConfigGenerator

Và đây là nội dung của file ConfigGenerator.tt.

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="Microsoft.Web.XmlTransform.dll" #>
<#@ import namespace="System.Xml" #>
<#@ output extension=".txt" #>
<#
string projectPath = Host.ResolveAssemblyReference("$(SolutionDir)") + "ConfigTransformDemo\\";
var environments = new string[] { "LOCAL", "PRODUCTION" };
foreach(var environment in environments)
{
 using(var transform = new Microsoft.Web.XmlTransform.XmlTransformation( projectPath + "DeploymentConfig\\Transforms\\" + environment + ".config"))
 {
 var document = new XmlDocument();
 document.Load(projectPath + "Web.config");
 transform.Apply(document);
 document.Save(projectPath + "DeploymentConfig\\Web." + environment + ".config");
 }
}
#>

Nội dung của file Local.config kèm với ví dụ sử dụng cú pháp SetAttributes và Replace của XDT được giải thích trong nội dung sau:


<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an attribute "name" that has a value of "MyDB".
    -->  
    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.
       -->
      <customErrors defaultRedirect="GenericError1.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
  </system.web>
</configuration>

Sau khi hoàn thành, bạn chỉ cần mở file ConfigGenerator.tt và nhấn Ctrl + S để nó sinh ra các file transform cho bạn.

YinYangIt’s Blog

Advertisements

4 thoughts on “ASP.NET – Kết hợp XDT Transform và T4 Text Template để tạo các file .config

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s