我们有一个应用程序,它部署在不同的管道中,专门用于各种发布。
对于前管道A-专用于三月发布管道B-6月发布等
在每个管道中,我们都有各种各样的环境,如DEV、SIT等
现在,随着发布,在部署代码时,我们需要对webcofig文件进行更改,因为我们在配置中的url依赖于管道和环境。
例如,我们有一个用于dev环境的web服务器框1。我们将管道A、管道B部署为网站。管道A的web.config看起来像-
<configMap hostnameList="box1" name="DevEnvironment">
<include set="Dev" />
</configMap>
<configSet name="Dev">
<add key="someUrl" value="http://somapp-piplelineA-Dev.app.com"/>
</configSet>
管道B的web.config看起来像-
<configMap hostnameList="box1" name="DevEnvironment">
<include set="Dev" />
</configMap>
<configSet name="Dev">
<add key="someUrl" value="http://somapp-piplelineB-Dev.app.com"/>
</configSet>
如果您看到这个配置,在键someurl的值中,pipelineA被更改为pipelineB。当有很多钥匙的时候,这些变化是令人厌烦的。因此,我们希望创建一个可供所有环境使用的web.config,它不需要任何更改。
使用Octopus Deploy,您可以半自动或完全自动部署web应用程序。但它也可以分别为每个环境执行Web.config转换。
您可以使用visual studio 内部内置的配置转换功能
如果您创建一个新的asp.net web项目,您将在web.debug.config
和web.release.config
中看到一个示例。
您也可以右键单击web.config
,然后单击添加配置转换,您将为每个构建配置都有一个配置转换文件。
你也可以使用SlowCheetah。这是一个非常方便的扩展。
这是我实现的,允许我们根据构建类型,利用构建事件动态创建配置。
这将允许你有1个配置来统治它们:)
https://xmlpreprocess.codeplex.com/
项目描述
XmlPreprocess是一个命令行实用程序,可以像代码预处理器一样修改带注释的XML文件。这对于将配置文件部署到不同的环境中进行替换(如连接字符串)非常有用。它可以很容易地集成到几乎任何脚本、构建工具或部署包中,以简化和集中您的部署策略。
我的构建事件
C:XMLPreprocessorXmlPreprocess.exe /i "C:AppConfigCore.config" /dbkind mssql /db "Server=localhostSQLEXPRESS;Database=DB1;User Id=dbreader; Password=pass1;" /e $(ConfigurationName)
这是我的配置XML文件的一个示例,{}参数是从SQL配置数据库中检索的,该数据库包含发布类型(1=调试,2=测试,3=发布),并相应地填充值。
<Nini>
<Section Name="AppSettings">
<!-- ifdef _xml_preprocess -->
<!--
<Key Name="RSAKeyStrength" Value="${RSAKeyStrength}"/>
<Key Name="EventLog_Name" Value="{EventLog_Name}"/>
<Key Name="DomainAddress" Value="${DomainAddress}"/>
<Key Name="AuthIssuer" Value="${AuthIssuer}"/>
-->
<!-- else -->
<Key Name="RSAKeyStrength" Value="2048"/>
<Key Name="EventLog_Name" Value="MyApp"/>
<Key Name="DomainAddress" Value="mydomain.com"/>
<Key Name="AuthIssuer" Value="auth.domain.com"/>
<!-- endif -->
</Section>
<Section Name="ConnectionStrings">
<!-- ifdef _xml_preprocess -->
<!--
<Key Name="IdentityUserModelEntities" Value="data source=${DB1ConnectionString};MultipleActiveResultSets=True"/>
<Key Name="DB1ModelEntities" Value="data source=${DB1ConnectionString};MultipleActiveResultSets=True"/>
<Key Name="LoggingDB1Entities" Value="data source=${LoggingDB1ConnectionString};MultipleActiveResultSets=True"/>
-->
<!-- else -->
<Key Name="IdentityUserModelEntities" Value="data source=localhostSQLEXPRESS;initial catalog=DB1;user id=admin;password=pass1;MultipleActiveResultSets=True"/>
<Key Name="DB1ModelEntities" Value="data source=localhostSQLEXPRESS;initial catalog=DB1;user id=admin;password=pass1;MultipleActiveResultSets=True"/>
<Key Name="LoggingDB1Entities" Value="data source=localhostSQLEXPRESS;Initial Catalog=LoggingDB1;user id=logging_admin;Password=pass1;MultipleActiveResultSets=True"/>
<!-- endif -->
</Section>
</Nini>