多级web.config转换

3

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

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

当针对prod1时,我想进行三方合并web.config < web.release.config < web.prod1.config。这个可行吗?

没有现成的解决方案可以做到这一点。如果你真的想要实现这个功能,最好的办法是编写自己的VS扩展、t4模板或后置构建命令等。虽然有一些选项可供选择,但它们都需要编写代码。 - Igor
2个回答

6
有一种方法可以实现这个。由于您没有太多具体的说明,我不确定这是否能满足您的要求。以下是从头开始完成此操作的方法,但您也可以直接将所需部分提取到已有的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等自己调整。


0

使用简单命令无法直接实现,但是您可以使用构建任务进行自定义转换和字符串替换。

一段时间前,我问了一个类似的问题,得到了一个非常好的答案,使用构建任务转换。不要在这里复制它,请查看解决方案并根据您的需求进行调整:

Service Fabric Default Publish Profile other than Local.xml


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接