SlowCheetah—Web.config转换语法现可推广到任意XML配置文件

原文发表地址 SlowCheetah - Web.config Transformation Syntax now generalized for any XML configuration file

原文发表时间 2011 8-23 8:49 AM

我去年写了一篇博文叫做如果你用Xcopy那你就错了,里面还包含了一个我在Mix10的讲话,展示如何用Web Deploy部署网站的视频。一个不为人们所知的功能叫做Web.config转换。你一看到就会马上想要一个通用解决方案的。

首先,摘自之前那篇博文:

你可以在web.config上右键,点击“添加配置转换”。你会得到一个web.debug.config和一个web.release.config。如果你喜欢,你也可以创建一个web.whatever.config。只要名称和配置资料一致就可以了。这些文件只是你想做的变更,并不是完全的web.config拷贝。

你可能会想你要用XSLT来转换web.config,他们用起来直觉上是对的,但其实很繁复。

这里有两个转换,一种用的是XSLT,另一种用XML文件转换语句/命名空间。在XSLT中可以有多种方法,但你采用了通用的想法。XSLT是一种广义树转换语言,而这个部署是常见场景特定子集中最优化的。最酷的部分是每个XDT转换是一个.NET插件,所以你可以自己制作。

    1: <?xml version="1.0" ?>
    2: <xsl:stylesheet xmlns:xsl="https://www.w3.org/1999/XSL/Transform" 
    3: version="1.0">
    4: <xsl:template match="@*|node()">
    5: <xsl:copy> 
    6:  
    7: <xsl:apply-templates select="@*|node()"/>
    8: </xsl:copy>
    9: </xsl:template>
   10: <xsl:template match="/configuration/appSettings">
   11: <xsl:copy>
   12: <xsl:apply-templates select="node()|@*"/>
   13: <xsl:element name="add">
   14: <xsl:attribute 
   15: name="key">NewSetting</xsl:attribute>
   16: <xsl:attribute name="value">New 
   17: Setting Value</xsl:attribute>
   18: </xsl:element>
   19: </xsl:copy>
   20: </xsl:template>
   21: </xsl:stylesheet>

或通过部署转换做同样的事:

    1: <configuration 
    2: xmlns:xdt="https://schemas.microsoft.com/XML-Document-Transform">
    3: <appSettings>
    4: <add name="NewSetting" value="New 
    5: Setting Value" xdt:Transform="Insert"/>
    6: </appSettings>
    7: </configuration>

这种配置文件转换其实很有用,是作为通用解决方案的首要功能需求。人们想要转换他们的app.config,或者XML文件作为他们构建的一部分。此外,目前的系统只是将转换作为公共进程的一部分,人们宁可要“F5”上的转换或者构建上的转换。所以,我的团队成员Sayed Ibrahim HashimiChuck England 刚完成一个小小的VsiX,叫做SlowCheetah XML 转换.

在这个截屏中,我创建了一个简单的操控台应用程序,创建了一个基本的app.config,然后右击选择“添加转换”。获取一个app.debug.config和app.release.config。你可以任意创建或命名,比如app.testing.config等等。

clip_image002

举例说,我的操控台应用程序有一个基本的app.config文件:

    1: <?xml version="1.0" encoding="utf-8" ?>
    2: <configuration >
    3: <appSettings>
    4: <add key="appName" value="Something"/>
    5: <add key="url" value="https://hanselman.com/"/>
    6: <add key="email" value="awesome@hanselman.com" 
    7: />
    8: </appSettings>
    9: </configuration>

这里的转换是把我开发时配置的一个值转换成一个调试值(或者测试,实行等等)。你可以为连接字符串,应用密匙,编译设置或XML中任意内容及配置文件来做这个转换。

    1: <?xml version="1.0" encoding="utf-8" ?>
    2: <configuration 
    3: xmlns:xdt="https://schemas.microsoft.com/XML-Document-Transform">
    4: <appSettings>
    5: <add key="appName" value="Demo-debug" 
    6: xdt:Transform="Replace" xdt:Locator="Match(key)"/>
    7: <add key="email" value="debug@contoso.com" 
    8: xdt:Transform="Replace" xdt:Locator="Match(key)"/>
    9: </appSettings>
   10: </configuration>

注意到转换=“替换?”那可以是替换,或者插入等等。有多种选择。ShowCheetah XML 转换Add-In还添加了“预览转换”右键菜单,使这些编写更容易。

最智能的是这些都是实际存在的。所有的功能都安装在%LOCALAPPDATA%\Microsoft\MSBuild\SlowCheetah\v1\,在标准MSBuild.targets文件中存在。你无需插件就可以在构建服务器上安装,只要复制文件或用源代码迁入,将他们与你的项目或MSBuild文件关联。它会像自定义目标一样通过工具添加到你的项目文件中:

    1: <Import 
    2: Project="$(LOCALAPPDATA)\Microsoft\MSBuild\SlowCheetah\v1\Microsoft.Transforms.targets" 
    3: Condition="Exists('$(LOCALAPPDATA)\Microsoft\MSBuild\SlowCheetah\v1\Microsoft.Transforms.targets')" 
    4: />

在创建目标和添加的菜单项目间,你会发现:

· 添加的桌面项目工具创建XDT转换

· 可转换能力

· 基于创建配置的桌面项目的app.config

· 基于创建配置的任何输出文件夹XML文件

· 添加的工具支持预览XDT转换

· 对于web项目你可以轻松的在打包/发布时转换其他XML文件

如果这很有用,而且你在Sayed的博客上或是VSGallery上的SlowCheetah项目网页使用过,那就让Sayed和团队知道你的想法把。

希望你们喜欢!