手动配置转换作为 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 转换引擎。
我有一个包含网站项目(以及其他项目类型)的解决方案文件。它使用发布配置文件进行部署,我正在尝试将整个内容移动到 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 转换引擎。