如何合并不同环境的 .net 自定义配置部分
How to merge .net custom config sections for different environments
我们的 .net 构建系统使用 Enterprise Library 4.1 来替换默认的 web.config 设置,方法是调用 MergeConfiguration.exe 并为每个环境(例如测试和生产),以便生成的安装程序打包所有环境的特定 web.config 并根据环境安装正确的版本。
这适用于企业库已知的部分,例如 appSettings 部分。但是,我们也有一些自定义部分,我想区分不同的环境,例如以下。
测试
<RoutingSection type="AbcSystem.RoutingSection, AbcSystem">
<Route Source="1" Destination="2" />
...
</RoutingSection>
用于生产
<RoutingSection type="AbcSystem.RoutingSection, AbcSystem">
<Route Source="1" Destination="3" />
...
</RoutingSection>
理想情况下,整个自定义部分在增量文件中指定,并在构建期间替换其原始版本的默认版本 web.config。
没有实现我们自己的增量合并工具,我还没有找到解决方案。相信这是软件开发的普遍需求,我正在寻找一种解决方案,最好是不涉及对上述过程进行太多更改的解决方案。它不一定是企业库。提前致谢。
下面的 msbuild 将复制您的原始文件并将值从 2 更新为 3。
您必须安装 MSBuildCommunityTasks 并获得正确的 "import project" 文件名....但下面的逻辑对您有用。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="AllTargetsWrapped">
<!--
<UsingTask AssemblyFile="$(ProgramFiles)\MSBuild\MSBuild.Community.Tasks.dll" TaskName="Version"/>
-->
<Import Project="$(MSBuildExtensionsPath32)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<PropertyGroup>
<!-- Always declare some kind of "base directory" and then work off of that in the majority of cases -->
<WorkingCheckout>.</WorkingCheckout>
</PropertyGroup>
<PropertyGroup>
<DestinationForProductionValue>3</DestinationForProductionValue>
</PropertyGroup>
<Target Name="AllTargetsWrapped">
<CallTarget Targets="CopyItTarget" />
<CallTarget Targets="WriteXmlPeekValue" />
</Target>
<Target Name="CopyItTarget">
<Copy SourceFiles="$(WorkingCheckout)\Parameters.xml" DestinationFiles="$(WorkingCheckout)\Parameters_PRODUCTION.xml"/>
<Error Condition="!Exists('$(WorkingCheckout)\Parameters_PRODUCTION.xml')" Text="No Copy Is Bad And Sad" />
</Target>
<Target Name="WriteXmlPeekValue" Condition=" '$(DestinationForProductionValue)' != '' ">
<XmlPoke
XmlInputPath="$(WorkingCheckout)\Parameters_PRODUCTION.xml"
Query="/root/RoutingSection/Route/@Destination"
Value="$(DestinationForProductionValue)" />
</Target>
</Project>
我最终使用了 SlowCheetah,为每个环境生成了一个转换后的配置文件。它也是 TFS 构建友好的,不需要更改构建过程。我还将之前使用 Enterprise Library 4.1 完成的合并与自定义部分一起移至 SlowCheetah。
我们的 .net 构建系统使用 Enterprise Library 4.1 来替换默认的 web.config 设置,方法是调用 MergeConfiguration.exe 并为每个环境(例如测试和生产),以便生成的安装程序打包所有环境的特定 web.config 并根据环境安装正确的版本。
这适用于企业库已知的部分,例如 appSettings 部分。但是,我们也有一些自定义部分,我想区分不同的环境,例如以下。
测试
<RoutingSection type="AbcSystem.RoutingSection, AbcSystem">
<Route Source="1" Destination="2" />
...
</RoutingSection>
用于生产
<RoutingSection type="AbcSystem.RoutingSection, AbcSystem">
<Route Source="1" Destination="3" />
...
</RoutingSection>
理想情况下,整个自定义部分在增量文件中指定,并在构建期间替换其原始版本的默认版本 web.config。
没有实现我们自己的增量合并工具,我还没有找到解决方案。相信这是软件开发的普遍需求,我正在寻找一种解决方案,最好是不涉及对上述过程进行太多更改的解决方案。它不一定是企业库。提前致谢。
下面的 msbuild 将复制您的原始文件并将值从 2 更新为 3。
您必须安装 MSBuildCommunityTasks 并获得正确的 "import project" 文件名....但下面的逻辑对您有用。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="AllTargetsWrapped">
<!--
<UsingTask AssemblyFile="$(ProgramFiles)\MSBuild\MSBuild.Community.Tasks.dll" TaskName="Version"/>
-->
<Import Project="$(MSBuildExtensionsPath32)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<PropertyGroup>
<!-- Always declare some kind of "base directory" and then work off of that in the majority of cases -->
<WorkingCheckout>.</WorkingCheckout>
</PropertyGroup>
<PropertyGroup>
<DestinationForProductionValue>3</DestinationForProductionValue>
</PropertyGroup>
<Target Name="AllTargetsWrapped">
<CallTarget Targets="CopyItTarget" />
<CallTarget Targets="WriteXmlPeekValue" />
</Target>
<Target Name="CopyItTarget">
<Copy SourceFiles="$(WorkingCheckout)\Parameters.xml" DestinationFiles="$(WorkingCheckout)\Parameters_PRODUCTION.xml"/>
<Error Condition="!Exists('$(WorkingCheckout)\Parameters_PRODUCTION.xml')" Text="No Copy Is Bad And Sad" />
</Target>
<Target Name="WriteXmlPeekValue" Condition=" '$(DestinationForProductionValue)' != '' ">
<XmlPoke
XmlInputPath="$(WorkingCheckout)\Parameters_PRODUCTION.xml"
Query="/root/RoutingSection/Route/@Destination"
Value="$(DestinationForProductionValue)" />
</Target>
</Project>
我最终使用了 SlowCheetah,为每个环境生成了一个转换后的配置文件。它也是 TFS 构建友好的,不需要更改构建过程。我还将之前使用 Enterprise Library 4.1 完成的合并与自定义部分一起移至 SlowCheetah。