2012-04-30 9 views
8

Ich versuche, alle die web.config-Dateien in einem Projekt, ich habe hier zu verwandeln ist eine meiner Baumstruktur:Wie erhalte ich eine Msbuild-Aufgabe, um Konfigurationsumwandlungen für eine Sammlung von Dateien durchzuführen?

  • Transform.bat
  • Wandelt
    • ConfigTransform.proj
    • Web .Transform.config
  • Webseite
    • web.config
    • Ansichten
      • web.config

Es gibt mehr web.config-Dateien, aber die Idee ist, dass dies alle von ihnen finden und gelten die gleichen Config-Transformation auf sie.

Ich habe ein paar Hinweise aus a blog post I found genommen, aber ich bleibe im letzten Schritt stecken, die eigentliche Transformation. Außerdem gibt es ein bisschen einen harten Teil in der Mitte, den ich nicht wirklich mag (ich verstehe nicht ganz, was ich mache und ich mache es offensichtlich falsch). Hier ist, wo ich bin so weit:

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

Mein Transform.bat sieht wie folgt aus:

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

Also, wenn ich die Batch aufrufen, die entsprechenden Verzeichnisse erstellt bekommen. Wie Sie jedoch sehen können, musste ich mit dem OutDir ein bisschen kreativ sein, um es zu machen .. \ N \ N. Aus irgendeinem Grund ist der OutDir-Pfad genau so wie das Eingabeverzeichnis, wenn ich dies nicht tue. Also muss ich natürlich etwas in MakeDir ändern, aber ich bin mir nicht sicher was.

Das eigentliche Problem kommt, wenn es beginnt, die Transformationen zu tun. Ich habe versucht, den TransformXML Source-Parameter so zu halten oder in etwa so:

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

Letzteres ist mir ein Fehler „konnte nicht geöffnet werden Quelldatei. Das Format der angegebenen Pfad wird nicht unterstützt“ und der ehemalige gibt mir diese Ausgabe:

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. 

auf meine Fragen zusammenfassen:

  1. Wie vermeide ich den Pfad Problem für die OutDir? Ich habe mit mehreren Pfaden getüftelt, aber ich kann es nicht richtig machen.
  2. Wie bekomme ich die TransformXml-Task, um mehrere Dateien im Source-Attribut zu akzeptieren?
+0

Bevor Sie in die Richtung gehen, in der Sie sich befinden, können Sie erklären, was Sie zu tun versuchen? –

+0

Umwandlung aller Konfigurationsdateien in meiner Lösung. – sebastiaan

+0

In der Post (unter der Baumstruktur) geklärt. – sebastiaan

Antwort

10

Ich denke, du warst ziemlich nah. Ich habe unten ein Beispiel eingefügt, das zeigt, wie das geht.

In meinem Beispiel entdecke ich die Transformation, die neben der Datei web.config selbst sitzt. Für Ihr Szenario können Sie einfach eine MSBuild-Eigenschaft verwenden, die auf eine bestimmte Datei verweist.

<?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 können Sie eine vollständige Probe bei https://github.com/sayedihashimi/sayed-samples/tree/master/TransformMultipleWebConfigs herunterladen.

+0

Wunderbar, mit ein wenig Feinabstimmung, um es so zu machen, wie ich es brauche, und indem ich einen Fehler mit dem MakeDir behebe (du hast den Backslash vergessen), macht es genau das, was ich will! https://gist.github.com/2601426 – sebastiaan

+0

Noch eine Frage: Kann ich $ (MSBuildProjectDirectory) \ ** \ web.config machen, aber die erste gefundene web.config (die im Root der Seite) ausschließen? – sebastiaan

+1

FYI Ich habe den Schrägstrich nicht vergessen, es wurde auf dem Grundstück selbst definiert. In MSBuild ist der Schrägstrich normalerweise am Ende der Eigenschaft definiert, so dass Sie nicht vergessen, wenn Sie die Eigenschaft verwenden. Ich würde empfehlen, dass Sie folgen, es sei denn, Sie können aus irgendeinem Grund nicht. Über Ihre andere Frage sollten Sie Exclude = "$ (MSBuildProjectDirectory) \ web.config" hinzufügen, um das root web.config zu überspringen. –

Verwandte Themen