Преобразование web.config из web.template.xml не работает

Я пытаюсь преобразовать преобразования web.config, как описано здесь. Мы использовали этот метод для других проектов, и он работает без проблем, но не в этом новом проекте.

Здесь я пробовал тестирование без успеха

  • Изменение имени файла wpp.targets в случае неправильного имени проекта. Я знаю текущий, который я использую, поскольку он единственный, который заставляет web.config перестраиваться из web.template.xml, это преобразование работает. Только вспомогательные шаблоны не работают.
  • Пробовал с xdt: Locator = "Match (name)"
  • Пробовал расширение .config vs .xml, другие наши проекты, в которых это работает .xml
  • Менеджер конфигурации настроен на использование конфигурации "Тест" для проекта, над которым я работаю.
  • web.template.Test.xml имеет xdt: Transform = "Заменить" для раздела, который я хочу заменить
  • web.template.xml имеет местозаполнитель
  • Попробовал удалить раздел "CopyWebTemplateConfig" из wpp.targets, как предложено в вопросе стека, связанного ниже. Наши другие проекты имеют это, и раздел "PropertyGroup" прокомментировал, и я пробовал обе комбинации.

Я прочитал эту ссылку несколько раз, и этот связанный стек question, но не может понять, в чем проблема.

Примечание Трансформация публикации работает в некотором роде. Он создает файл web.template.xml, который содержит значения из web.template.Test.xml, но не создает файл web.config.xml, как указано в инструкциях wpp.targets. Так что это больше проблема с тем, как заставить преобразование сборки работать.

У кого-нибудь есть представление о том, что отсутствует?

wpp.targets

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- Make sure web.config will be there even for package/publish -->
  <Target Name="CopyWebTemplateConfig" BeforeTargets="Build">
    <Copy SourceFiles="web.template.xml"
          DestinationFiles="web.config"/>
  </Target>

  <PropertyGroup>
    <PrepareForRunDependsOn>
      $(PrepareForRunDependsOn);
      UpdateWebConfigBeforeRun;
    </PrepareForRunDependsOn>
  </PropertyGroup>

  <!-- This target will run right before you run your app in Visual Studio -->
  <Target Name="UpdateWebConfigBeforeRun">
    <Message Text="Configuration: $(Configuration): Web.template.$(Configuration).xml"/>
    <TransformXml Source="web.template.xml"
              Transform="web.template.$(Configuration).xml"
              Destination="web.config" />
  </Target>

  <!-- Exclude the config template files from the created package -->
  <Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage">
    <ItemGroup>
      <ExcludeFromPackageFiles Include="web.template.xml;web.template.*.xml"/>
    </ItemGroup>
    <Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/>
  </Target>
</Project>

web.template.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->
<configuration>
  <configSections>           
    <sectionGroup name="TestSettings"></sectionGroup>
    ....
  </configSections>
    ....
  <TestSettings>
  </TestSettings>
   ....
</configuration>

web.template.Test.xml

<?xml version="1.0"?>
<!-- For more information on using transformations 
     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <TestSettings xdt:Transform="Replace">
    ...
  </TestSettings>
</configuration>

Выход MSBuild

Target "UpdateWebConfigBeforeRun: (TargetId:143)" in file "C:\...\Project.wpp.targets" from project "C:\...\Project.csproj" (target "PrepareForRun" depends on it):
Task "Message" (TaskId:93)
  Configuration: Test: Web.template.Test.xml (TaskId:93)
Done executing task "Message". (TaskId:93)
Task "TransformXml" (TaskId:94)
  Transforming Source File: Web.template.xml (TaskId:94)
    Applying Transform File: Web.template.Test.xml (TaskId:94)
    Executing Replace (transform line 5, 18) (TaskId:94)
      on /configuration/TestSettings (TaskId:94)
      Applying to 'TestSettings' element (source line 121, 4) (TaskId:94)
      Replaced 'TestSettings' element (TaskId:94)
    Done executing Replace (TaskId:94)
    Output File: web.config (TaskId:94)
  Transformation succeeded (TaskId:94)
Done executing task "TransformXml". (TaskId:94)
Done building target "UpdateWebConfigBeforeRun" in project "Project.csproj".: (TargetId:143)

Ответ 1

У меня есть решение моей проблемы, но не знаю, в чем причина, поэтому не уверен, что это решит ее в других случаях.

Я просмотрел вывод диагностики MSBuild и заметил, что к концу появился другой раздел, который скопировал web.template в web.config. Обратите внимание, что это происходит после того, как цель UpdateWebConfigBeforeRun уже запущена и внесла свои обновления из файла преобразования подматрица в файл web.config. Похоже, что этот последний шаг был переопределением web.config с преобразованием, которое я хотел.

Я не был уверен, откуда появился этот последний набор инструкций по копированию, поэтому я выполнил поиск всех файлов на моем ПК, которые ищут другие файлы wpp.target. Я нашел еще один в папке расширения Slow Cheetah и увидел часть раздела вверху, которая устанавливала свойство transformOnBuild в false.

Подумав о конфликте с SlowCheetah, я удалил его, и преобразования начали работать, как ожидалось. Это было еще немного странно, так как другие решения работали с SlowCheetah. По прихоти я снова установил SlowCheetah, и трансформация продолжала работать, как ожидалось.

Итак, мое решение оказалось переустановкой SlowCheetah. Я до сих пор смущен о том, в чем причина этой проблемы, поэтому, если кто-нибудь еще ответит на это, я дам им награду.

Ответ 2

Я установил StyleCop, и это делало для меня переписывание.

Поэтому я удалил его, и проблема была решена.

Забавно, что я снова установил StyleCop, и преобразование все еще работало!

Также в некоторых случаях я заметил, что я должен удалить целевой раздел CopyWebTemplateConfig.

Ответ 3

У меня была аналогичная проблема на прошлой неделе. Оказывается, всякий раз, когда вы добавляете проект в решение в VS 2010, правильная конфигурация проекта не применяется постоянно. Таким образом, вы считаете, что у вас активна конфигурация, но другая активна в этом проекте, поэтому преобразование, которое вы ожидаете, не применяется.

Проверьте действия последнего комментария этой проблемы: Конфигурация пользовательского решения не отображается в Visual Studio 2010

Ответ 4

"Я знаю текущий, который я использую, поскольку он единственный, который заставляет web.config перестраиваться из web.template.xml, этот трансформатор работает. Только вспомогательные шаблоны не работают".

Означает ли это, что трансформация работает, но раздел TestSettings не преобразуется?

Можете ли вы поделиться сборкой с msbuild с подробностью, установленной для диагностики/детализации?