手动配置转换作为 TFS 构建步骤

Manual config transform as TFS build step

我有一个包含网站项目(以及其他项目类型)的解决方案文件。它使用发布配置文件进行部署,我正在尝试将整个内容移动到 TFS (2015) 以自动化构建和部署过程。如所述 here I cannot manage the build configuration since it is a web site project and consequently cannot use the Web.config Transformation feature.

我想执行某种转换,也许作为构建步骤。我可以手动创建和维护 web.release.config 文件,但不知道如何手动转换它。是否存在 XLST 文件以在 Visual Studio 之外对其进行转换(例如调用 XSLT 处理器的 cmd 构建步骤)?

附录:转换为 Web 项目绝对可以解决问题,但对我来说不是解决方案,因为这需要远程承包商的参与,为我们的代码库做出贡献 - a TFS 构建级解决方案是我唯一要找的东西。

正如@MrHinsh 在评论中提到的,建议创建一个 Web 应用程序项目而不是网站项目,因为网站项目默认没有 web.release.config 文件,而 Web 应用程序项目有.

要用变量值替换文件中的标记,您可以在构建定义中添加一个 Replace Tokens 任务。

由于我的实际转换相对简单,所以我开发了这个 XSL 转换:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>
  <xsl:variable name="xformPath">web.Prod.config</xsl:variable>
  <xsl:variable name="xform" select="document($xformPath)"></xsl:variable>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template name="output-transform">
    <xsl:param name="xformNode" />
    <xsl:variable name="key" select="@key" />
    <xsl:choose>
      <xsl:when test="$xformNode">
        <xsl:copy-of select="$xformNode" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="/configuration/appSettings/add">
    <xsl:variable name="key" select="@key" />
    <xsl:call-template name="output-transform">
      <xsl:with-param name="xformNode" select="$xform/configuration/appSettings/add[@key=$key]" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="/configuration/connectionStrings/add">
    <xsl:variable name="name" select="@name" />
    <xsl:call-template name="output-transform">
      <xsl:with-param name="xformNode" select="$xform/configuration/connectionStrings/add[@name=$name]" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="/configuration/system.web/customErrors">
    <xsl:call-template name="output-transform">
      <xsl:with-param name="xformNode" select="$xform/configuration/system.web/customErrors" />
    </xsl:call-template>
  </xsl:template>
</xsl:stylesheet>

这有一些明显的缺点,

  • 必须手动定义要替换的项目
  • 替换为整个元素,而不仅仅是指定的属性
  • 不维护子元素(例如,我试图将 system.web/compilation@debug 更改为 false,但我丢失了所有 system.web/compilation/assemblies 条目)

我计划在我的 Visual Studio 构建步骤和复制文件步骤之间的命令行步骤中添加它,并调用 msxsl.exe 或 Saxon 的 HE 转换引擎。