多级web.config转换

fil*_*lur 1 c# asp.net web-config

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

web.config
 - web.release.config
   - web.prod1.config
   - web.prod2.config
Run Code Online (Sandbox Code Playgroud)

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

pei*_*ent 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>
Run Code Online (Sandbox Code Playgroud)

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

.\msbuild.exe "PATH_TO_YOUR_CSPROJ\Transform.csproj" /t:TransformRelease
.\msbuild.exe "PATH_TO_YOUR_CSPROJ\Transform.csproj" /t:TransformProd
Run Code Online (Sandbox Code Playgroud)

这将使用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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

运行上面的命令产生了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>
Run Code Online (Sandbox Code Playgroud)

UPDATE

虽然上述工作,但我不想以这种方式使用它.在稍微修改了.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>
Run Code Online (Sandbox Code Playgroud)

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