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

时间:2016-12-28 16:07:11

标签: xslt visual-studio-2015 tfs tfs2015 web-site-project

我有一个包含网站项目(以及其他项目类型)的解决方案文件。它使用发布配置文件进行部署,并且我试图将整个内容移至TFS(2015)以自动化构建和部署过程。如上所述here我无法管理构建配置,因为它是一个网站项目,因此无法使用Web.config Transformation feature

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

附录:转换为Web项目肯定会解决问题,但不是我的解决方案,因为这需要远程承包商参与我们的代码库 - TFS构建级解决方案是我唯一要找的东西。

2 个答案:

答案 0 :(得分:0)

正如@MrHinsh在评论中提到的那样,建议创建Web应用程序项目而不是Web站点项目,因为Web站点项目默认情况下没有web.release.config文件,而Web应用程序项目具有。< / p>

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

enter image description here

答案 1 :(得分:0)

由于我的实际转换相对简单,我开发了这个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 Build步骤和Copy Files步骤之间的命令行步骤中添加它,并调用msxsl.exe或Saxon的HE转换引擎。