我们正在使用VSTS进行持续集成(CI)。我们在签入时配置了自动构建,然后在构建成功时自动释放。 我们添加了一个名为" CI"到项目,以及web.CI.config转换文件,以替换应用程序设置和连接字符串以匹配目标环境,以及" CI"使用CI配置发布配置文件。
当构建由VSTS完成时,生成的web.config文件中缺少许多元素。具体而言,< system.web>部分几乎是空的; < authentication>,< pages>等元素或< siteMap>缺少,导致网站无法正常工作。
生成的web.config文件中的System.web部分:
<system.web>
<compilation targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
</system.web>
&lt; appSettings&gt;上的转换和&lt; connectionStrings&gt;部分正确应用。此外,当我使用CI配置文件在本地发布(从Visual Studio Enterprise 2015)时,配置转换按预期完成(system.web中没有元素丢失,网站按预期运行)。
我假设VSTS构建还应用了web.CI.config中指定的其他转换。
问题是:如何阻止VSTS构建转换web.config文件?
以下是在VSTS中配置构建步骤的方法:
变量在变量部分中配置:
“高级”和“控制选项”部分保留了默认值。
构建步骤类型是 Visual Studio Build 。我也尝试了 MSBuild ,结果相同。
(删除敏感信息)
<configuration>
<configSections>
<sectionGroup name="AspNetPerformance.Tools">
<section name="Caching" requirePermission="false" type="AspNetPerformance.Tools.Configuration.AspNetPerformanceSection, AspNetPerformance.Tools"/>
<section name="Minifying" requirePermission="false" type="AspNetPerformance.Tools.Configuration.AspNetPerformanceSection, AspNetPerformance.Tools"/>
</sectionGroup>
</configSections>
<appSettings>
<add key="TheKey" value="TheValue" />
<!-- other add elements -->
</appSettings>
<connectionStrings>
<clear/>
<add name="FirstConnectionString" connectionString="..." providerName="System.Data.SqlClient" />
<add name="SecondConnectionString" connectionString="..." providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.5.2"/>
<trace enabled="true"/>
<customErrors mode="Off"/>
<authentication mode="Windows"/>
<pages enableSessionState="true" controlRenderingCompatibilityVersion="4.0" clientIDMode="Static">
<controls>
<add tagPrefix="atk" namespace="AjaxControlToolkit" assembly="AjaxControlToolkit"/>
<!-- other add elements -->
</controls>
</pages>
<siteMap enabled="true" defaultProvider="CustomXmlSiteMapProvider">
<providers>
<add name="CustomXmlSiteMapProvider" type="..." securityTrimmingEnabled="false" siteMapFile="Web.sitemap"/>
</providers>
</siteMap>
<webServices>
<protocols>
<add name="HttpPost"/>
</protocols>
</webServices>
<httpCookies httpOnlyCookies="true"/>
<sessionState cookieless="UseCookies"/>
<authorization>
<deny users="?"/>
</authorization>
<globalization uiCulture="en-US" />
</system.web>
</configuration>
(删除敏感信息)
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="TheKey" value="TheNewValue" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
<!-- all other settings transformed the same way -->
</appSettings>
<connectionStrings>
<add name="FirstConnectionString" connectionString="NewValue" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
<add name="SecondConnectionString" connectionString="NewValue" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>
</configuration>
我发布了Web.config和Web.CI.config,因为它被问到了,但我重复一遍,即执行预期的转换(包括删除system.web下编译元素中的debug属性)。此外,当我使用CI配置在本地部署时,生成的Web.config文件是预期的。我不认为问题出在web.config转换本身,但是在VSTS中。