2012-04-30 2 views
8

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

  • Transform.bat
  • Трансформация
    • ConfigTransform.proj
    • Web .Transform.config
  • Сайт
    • Web.config
    • Просмотров
      • web.config

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

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

<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> 

Мой Transform.bat выглядит следующим образом:

%systemroot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe %CD%\Transforms\ConfigTransform.proj 

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

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

@(_FilesToTransformNotAppConfig->'%(FullPath)') 

Последнее дает мне ошибку «Не удалось открыть файл Источник: формат данного пути не поддерживается.» и бывший дает мне этот выход:

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. 

Чтобы резюмировать мои вопросы:

  1. Как избежать проблемы пути для OUTDIR? Я искал несколько путей, но я не могу понять это правильно.
  2. Как заставить задачу TransformXml принимать несколько файлов в атрибуте Source?
+0

Прежде чем отправиться туда, где вы находитесь, вы можете объяснить, что именно вы пытаетесь сделать? –

+0

Преобразование всех файлов конфигурации в моем решении. – sebastiaan

+0

Уточненный в сообщении (под древовидной структурой). – sebastiaan

ответ

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/TransformMultipleWebConfigs.

+0

Замечательный, с небольшой настройкой, чтобы он работал так, как мне это нужно, и, исправляя ошибку с помощью MakeDir (вы забыли обратную косую черту), он делает именно то, что я хочу! https://gist.github.com/2601426 – sebastiaan

+0

Еще один вопрос: могу ли я сделать $ (MSBuildProjectDirectory) \ ** \ web.config, но исключить первый найденный web.config (тот, который находится в корневом каталоге сайта)? – sebastiaan

+1

FYI Я не забыл косую черту, она была определена на самой собственности. Обычно в MSBuild косая черта определяется в конце свойства, поэтому вы не забываете, когда используете свойство. Я бы порекомендовал вам следовать этому, если вы по какой-то причине не можете. О вашем другом вопросе вы должны добавить Exclude = "$ (MSBuildProjectDirectory) \ web.config", чтобы пропустить root web.config. –

 Смежные вопросы

  • Нет связанных вопросов^_^