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

8

Я пытаюсь преобразовать все файлы 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?
Прежде чем идти туда, где ты находишься, можешь объяснить, что ты пытаешься сделать? Sayed Ibrahim Hashimi
Уточняется в посте (под древовидной структурой). sebastiaan
Куда ты хочешь записать преобразованные файлы? Sayed Ibrahim Hashimi
Мне все равно, где такая же структура папок, как у исходных файлов. sebastiaan
Преобразование всех файлов конфигурации в моем решении. sebastiaan

Ваш Ответ

1   ответ
10

ты был довольно близок. Я вставил образец ниже, который показывает, как это сделать.

В моем примере я обнаружил преобразование рядом с самим файлом web.config. Для вашего сценария вы можете просто использовать свойство MSBuild, указывающее на определенный файл.

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

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)'=='' ">Release</Configuration>
    <OutputFolder Condition=" '$(OutputFolder)'=='' ">C:\temp\transformed-files\</OutputFolder>
  </PropertyGroup>

  <!--
  This target shows how to transform web.config with a specific transform file associated to that specific web.config file.
  -->
  <Target Name="TransformAll">

    <!-- discover the files to transform -->
    <ItemGroup>
      <FilesToTransofm Include="$(MSBuildProjectDirectory)\**\web.config"/>
    </ItemGroup>

    <!-- Ensure all target directories exist -->
    <MakeDir Directories="@(FilesToTransofm->'$(OutputFolder)%(RecursiveDir)')"/>

    <!-- TransformXml only supports single values for source/transform/destination so use %(FilesToTransofm.Identity)
         to sned only 1 value to it -->
    <TransformXml Source="%(FilesToTransofm.Identity)"
                  Transform="@(FilesToTransofm->'%(RecursiveDir)web.$(Configuration).config')"
                  Destination="@(FilesToTransofm->'$(OutputFolder)%(RecursiveDir)web.config')" />    
  </Target>

</Project>

FYI вы можете скачать полный образец наhttps: //github.com/sayedihashimi/sayed-samples/tree/master/TransformMultipleWebConfig.

Замечательно, с небольшой настройкой, чтобы он работал так, как мне нужно, и исправляя ошибку с MakeDir (вы забыли обратную косую черту), он делает именно то, что я хочу! Gist.github.com / 2601426 sebastiaan
FYI Я не забыл косую черту, она была определена на самой собственности. В MSBuild обычно косая черта определяется в конце свойства, чтобы вы не забыли при использовании свойства. Я бы порекомендовал вам следовать этому, если вы не можете по какой-либо причине. По поводу вашего другого вопроса вы должны добавить Exclude = "$ (MSBuildProjectDirectory) \ web.config", чтобы пропустить корневой web.config. Sayed Ibrahim Hashimi
Еще один вопрос: могу ли я сделать $ (MSBuildProjectDirectory) ** \ web.config, но исключить первый найденный web.config (тот, что находится в корне сайта)? sebastiaan
Имеет смысл! Я видел несколько разных соглашений. Спасибо за вашу помощь, за исключением того, что это действительно сработало. Сообщение в блоге с конечным результатом этого находится здесь: Cultiv.nl / блог / 2012/5/5 / спектрально-Umbraco-51-к-4 MVC sebastiaan
круто, рад, что у тебя получилось Sayed Ibrahim Hashimi

Похожие вопросы