Многоуровневое преобразование web.config - PullRequest
0 голосов
/ 13 ноября 2018

Есть ли способ применить преобразование web.config на нескольких уровнях?Например:

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

При таргетинге на prod1 я хотел бы выполнить трехстороннее слияние web.config < web.release.config < web.prod1.config.Это возможно?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Есть способ сделать это. Поскольку вы не указываете слишком много, я не уверен, что это удовлетворит ваши требования. Ниже показано, как это можно сделать с нуля, но вы можете просто вставить нужные биты прямо в уже имеющийся у вас 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.config с использованием преобразований в web.release.config и создаст новый файл с результатом этого преобразования web.new.config. Затем вторая команда преобразует файл web.new.config, используя преобразования в файле web.prod.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>

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>

С этими параметрами, определенными в вашем файле .csproj, при сборке проекта как есть он применяет только преобразование Release. Когда вы строите проект в конфигурации Release, он будет применять преобразования Release и Prod. Очевидно, вам нужно настроить его для ваших нужд, учитывая prod1, prod2 и т. Д.

0 голосов
/ 05 декабря 2018

Невозможно из коробки с простыми командами, но вы можете выполнить пользовательское преобразование и замену строки, используя задачи сборки

Некоторое время назад я задавал похожие вопросы, и я получил действительно хороший ответ, используя задачи сборкипреобразование.Вместо того, чтобы скопировать его здесь, взгляните на решение и адаптируйте его под свои потребности .:

Профиль публикации по умолчанию Service Fabric, отличный от Local.xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...