是否可以在多个级别上应用web.config转换?例如:
web.config
- web.release.config
- web.prod1.config
- web.prod2.config
定位prod1
时,我想进行三向合并web.config < web.release.config < web.prod1.config
。这可能吗?
答案 0 :(得分:5)
有一种方法可以完成此任务。由于您没有指定太多,因此我不确定这是否可以满足您的要求。以下是如何从头开始实现的方法,但是您可以将所需的位直接拉到已经拥有的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等,您将需要对其进行调整。
答案 1 :(得分:0)
使用简单的命令无法立即使用,但是您可以使用构建任务进行自定义转换和字符串替换
前一段时间,我问了类似的问题,并且使用构建任务转换得到了一个非常好的答案。无需在此处复制它,而可以查看解决方案并适应您的需求。