gpt4 book ai didi

c# - 多级 web.config 转换

转载 作者:行者123 更新时间:2023-12-05 00:07:15 27 4
gpt4 key购买 nike

有没有办法在多个级别上应用 web.config 转换?例如:

web.config
- web.release.config
- web.prod1.config
- web.prod2.config

定位 prod1 时,我想进行 3 路合并 web.config < web.release.config < web.prod1.config .这可能吗?

最佳答案

有一种方法可以做到这一点。由于您没有指定太多,我不确定这是否会满足您的要求。以下是如何从头开始完成的,但您可以直接将需要的位直接拉入已有的 csproj 中。

创建 .csproj 文件:

Transform.csproj

<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Include="Web.config" />
<None Include="Web.Debug.config">
<DependentUpon>Web.config</DependentUpon>
</None>
<None Include="Web.Prod.config">
<DependentUpon>Web.config</DependentUpon>
</None>
<None Include="Web.Release.config">
<DependentUpon>Web.config</DependentUpon>
</None>
</ItemGroup>
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll"/>
<Target Name="TransformRelease">
<TransformXml Source="Web.config"
Transform="Web.Release.config"
Destination="Web.New.config"/>
</Target>
<Target Name="TransformProd">
<TransformXml Source="Web.New.config"
Transform="Web.Prod.config"
Destination="Web.New.config"/>
</Target>
</Project>

然后您可以通过从命令行调用 msbuild 命令来执行您的两个转换。我使用了以下 powershell 命令。

.\msbuild.exe "PATH_TO_YOUR_CSPROJ\Transform.csproj" /t:TransformRelease
.\msbuild.exe "PATH_TO_YOUR_CSPROJ\Transform.csproj" /t:TransformProd

这将使用 web.release.config 中的转换来转换您的 web.config,并使用该转换 web.new.config 的结果创建一个新文件。然后第二个命令将使用 web.prod.config 中的转换来转换 web.new.config,并使用转换后的值更新 web.new.config。

Web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="web" value="web" />
<add key="release" value="web" />
<add key="prod" value="web" />
<add key="release:prod" value="web" />
</appSettings>
</configuration>

Web.Release.config

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="release" value="release" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
<add key="release:prod" value="release" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
</appSettings>
</configuration>

Web.Prod.config

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="prod" value="prod" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
<add key="release:prod" value="prod" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
</appSettings>
</configuration>

运行以上命令生成Web.New.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="web" value="web" />
<add key="release" value="release" />
<add key="prod" value="prod" />
<add key="release:prod" value="prod" />
</appSettings>
</configuration>

更新

虽然上述方法有效,但我不想以那种方式使用它。在稍微修改 .csproj 之后,我想到了这个,它将在 BeforeBuild 任务中为您完成转换。

  <Target Name="TransformRelease">
<TransformXml Source="Web.config" Transform="Web.Release.config" Destination="Web.New.config" />
</Target>
<Target Name="TransformProd" Condition="'$(Configuration)' == 'Release'">
<TransformXml Source="Web.New.config" Transform="Web.Prod.config" Destination="Web.New.config" />
</Target>
<Target Name="BeforeBuild">
<MSBuild Projects="WebApplication1.csproj" Targets="TransformRelease;TransformProd"/>
</Target>

在您的 .csproj 文件中定义这些后,当您按原样构建项目时,它将单独应用 Release 转换。当您在 Release 配置中构建项目时,它将同时应用 Release 和 Prod 转换。显然,您需要根据 prod1、prod2 等的需要对其进行调整。

关于c# - 多级 web.config 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53284827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com