Как получить задачу msbuild для выполнения преобразований конфигурации для коллекции файлов?

Я пытаюсь преобразовать все файлы web.config в проект, который у меня есть, вот моя древовидная структура:

Transform.bat Transforms ConfigTransform.proj Web.Transform.config Website web.config Views web.config

Есть еще файлы web.config, но идея заключается в том, что он найдет их все и применит к ним одинаковое преобразование конфигурации.

Я взял несколько подсказок отсообщение в блоге, которое я нашел но я застреваю на последнем шаге, фактическом преобразовании. Также в середине есть немного грубая деталь, которая мне не очень нравится (я не совсем понимаю, что я делаю, и я, очевидно, делаю это неправильно). Вот где я сейчас нахожусь:

<code><Project ToolsVersion="4.0" DefaultTargets="Transform" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="TransformXml" AssemblyFile="Tools\Microsoft.Web.Publishing.Tasks.dll"/>

    <PropertyGroup>
        <SitePath>..\..\Website</SitePath>
        <WebConfigTransformInputFile>$(SitePath)\Web.config</WebConfigTransformInputFile>
        <WebConfigTransformFile>Web.Transform.config</WebConfigTransformFile>
        <OutDir>..\N\N\</OutDir>

    </PropertyGroup>

    <ItemGroup>
        <_FilesToTransform Include="$(SitePath)\**\web.config"/>
    </ItemGroup>

    <Target Name="Transform">

    <MakeDir Directories="@(_FilesToTransform->'$(OutDir)%(RelativeDir)')" />

    <TransformXml Source="@(_FilesToTransform->'$(OutDir)%(RelativeDir)%(Filename)%(Extension)')"
                  Transform="$(WebConfigTransformFile)"
                  Destination="@(_FilesToTransform->'$(OutDir)%(RelativeDir)%(Filename)%(Extension)')" />
    </Target>
</Project>
</code>

Мой Transform.bat выглядит так:

<code>%systemroot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe %CD%\Transforms\ConfigTransform.proj
</code>

Поэтому, когда я вызываю пакет, создаются соответствующие каталоги. Однако, как вы можете видеть, я должен был быть немного креативнее с OutDir, делая это .. \ N \ N. По какой-то причине, если я этого не сделаю, путь OutDir будет точно таким же, как входной каталог. Поэтому мне, очевидно, нужно что-то изменить в MakeDir, но я не уверен, что именно.

Настоящая проблема возникает, когда он начинает делать преобразования. Я пытался сохранить параметр TransformXml Source следующим образом:

<code>@(_FilesToTransformNotAppConfig->'%(FullPath)')
</code>

Последнее выдает мне ошибку "Не удалось открыть исходный файл: указанный формат пути не поддерживается". и первый дает мне такой вывод:

<code>Build started 30-4-2012 14:02:48.
Project "D:\Dev\transform\DoTransforms\Transforms\ConfigTransform.proj" on node 1 (default targets).
Transform:
  Creating directory "..\N\N\..\..\Website\Views\".
  Transforming Source File: ..\N\N\..\..\Website\Views\Web.config;..\N\N\..\..\Website\Web.config
D:\Dev\transform\DoTransforms\Transforms\ConfigTransform.proj(32,2): error : Could not open Source file: Could not find a part of the path 'D:\Dev\transform\DoTransforms\Website\Views\Web.config;\Website\Web.config'.
  Transformation failed
Done Building Project "D:\Dev\transform\DoTransforms\Transforms\ConfigTransform.proj" (default targets) -- FAILED.

Build FAILED.
</code>

Подводя итог моим вопросам:

How do I avoid the path issue for the OutDir? I've fiddled with multiple paths but I can't get it right. How do I get the TransformXml task to accept multiple files in the Source attribute?

Ответы на вопрос(1)

Ваш ответ на вопрос