2

Je suis en train d'exécuter plusieurs commandes sur une liste de fichiers à partir d'un modèle (tous les fichiers de forme *.config sous sous-répertoires d'un répertoire donné), comme suit:Transformer plusieurs fichiers de configuration pour plusieurs projets via un fichier MsBuildProj

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

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

    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <TransformConfiguration>Release</TransformConfiguration> 
    <PublishFolder>$(OutDir)_PublishedWebsites</PublishFolder> 
    </PropertyGroup> 

    <Target Name="BuildSolution"> 
    <MSBuild Projects="$(MSBuildProjectDirectory)\SolutionName.sln" 
     ContinueOnError="false" 
     Properties="PublishProfile=$(TransformConfiguration);DeployOnBuild=true" /> 
    </Target> 

    <ItemGroup> 
    <ConfigFiles Include="$(PublishFolder)\**\*.config" /> 
    </ItemGroup> 

    <Target Name="TransformWebConfig" AfterTargets="BuildSolution" 
      Condition="'@(ConfigFiles)'!=''" 
      Outputs="%(ConfigFiles.Identity)"> 

    <PropertyGroup> 
     <ConfigFile>%(ConfigFiles.Identity)</ConfigFile> 
     <BackupFile>$([System.IO.Path]::ChangeExtension($(ConfigFile),&quot;.Source.config&quot;))</BackupFile> 
     <TransformFile>$([System.IO.Path]::ChangeExtension($(ConfigFile),$(TransformConfiguration) + &quot;.Source.config&quot;))</TransformFile> 
    </PropertyGroup> 

    <Message Text="$(ConfigFile)" /> 
    <Message Text="$(BackupFile)" /> 
    <Message Text="$(TransformFile)" /> 

    <Copy SourceFiles="$(ConfigFile)" 
      DestinationFiles="$(BackupFile)" /> 

    <Exec Command="attrib -r $(ConfigFile)" /> 

    <TransformXml Source="$(BackupFile)" 
        Transform="$(TransformFile)" 
        Destination="$(ConfigFile)" 
        StackTrace="false" /> 

    </Target> 

</Project> 

Cependant, le traitement par lots des fichiers correspondants n'est pas effectué.

  • des sorties, j'ai ajouté, je vois que la propriété $(PublishFolder) pointe vers le répertoire correct, cependant, l'élément @(ConfigFiles) est laissé vide.

J'ai aussi essayé la liste manuellement les noms de répertoire et les noms de fichiers de configuration comme ceci:

<ItemGroup> 
    <Sites Include="Site1" /> 
    <Sites Include="Site2" /> 
    </ItemGroup> 
    <ItemGroup> 
    <ConfigFiles Include="Web" /> 
    <ConfigFiles Include="NLog" /> 
    </ItemGroup> 

    <Target Name="TransformWebConfig" AfterTargets="BuildSolution"> 

    <PropertyGroup> 
     <SiteConfigFile>$(PublishFolder)\%(Sites.Identity)\%(ConfigFiles.Identity)</SiteConfigFile> 
    </PropertyGroup> 

    <Message Text="$(SiteConfigFile)" /> 

    <Copy SourceFiles="$(SiteConfigFile).config" 
      DestinationFiles="$(SiteConfigFile).Source.config"/> 

    <Exec Command="attrib -r $(SiteConfigFile).config" /> 

    <TransformXml Source="$(SiteConfigFile).Source.config" 
        Transform="$(SiteConfigFile).$(TransformConfiguration).config" 
        Destination="$(SiteConfigFile).config" 
        StackTrace="false" /> 
    </Target> 

Cependant, dans ce cas, la transformation est uniquement appliqué sur un fichier sur un site.


Une idée de ce qu'il faut faire pour que cela fonctionne?


questions et références MSDN similaires Je suis passé par:

MSBUild: Copy files with a name based on the original (following a pattern)

MSBuild multiple outputpath

How to invoke the same msbuild target twice with different parameters from within msbuild project file itself

msbuild array iteration

http://msdn.microsoft.com/en-us/library/ms171454.aspx


Edit:

Déplacement du ItemGroup sous la tâche a permis la lecture de la liste des fichiers après que les fichiers ont été créés, mais, maintenant que le premier fichier de la liste se transforme:

<ItemGroup> 
    <ConfigFiles Include="$(PublishFolder)\**\Web.config;$(PublishFolder)\**\NLog.config" 
       Exclude="$(PublishFolder)\**\Packages.config;$(PublishFolder)\**\*.*.config;$(PublishFolder)\**\bin\*.config" /> 
</ItemGroup> 

<PropertyGroup> 
    <ConfigFile>%(ConfigFiles.Identity)</ConfigFile> 
    <BackupFile>$([System.IO.Path]::ChangeExtension($(ConfigFile),&quot;.Source.config&quot;))</BackupFile> 
    <TransformFilePrefix>$([System.String]::Concat($(TransformConfiguration), &quot;.config&quot;))</TransformFilePrefix> 
    <TransformFile>$([System.IO.Path]::ChangeExtension($(ConfigFile), $(TransformFilePrefix)))</TransformFile> 
</PropertyGroup> 

<Message Text="$(PublishFolder)" /> 
<Message Text="@(ConfigFiles)" /> 
<Message Text="$(ConfigFile)" /> 
<Message Text="$(BackupFile)" /> 
<Message Text="$(TransformFile)" /> 

<Copy SourceFiles="$(ConfigFile)" 
     DestinationFiles="$(BackupFile)" /> 

<Exec Command="attrib -r $(ConfigFile)" /> 

<TransformXml Source="$(BackupFile)" 
       Transform="$(TransformFile)" 
       Destination="$(ConfigFile)" 
       StackTrace="false" /> 

+0

Qu'est-ce que PublishFolder sur. J'ai essayé l'exemple un et quand j'ai placé PublishFolder pour pointer vers quelques fichiers de configuration je vois TransformWebConfig appelé plusieurs fois et la propriété de ConfigFile est correcte. La propriété TransformFile n'est pas créée correctement. –

+0

@BrianWalker $ (OutDir) _PublishedWebsites où $ (OutDir) est l'endroit où la machine de construction place tous les binaires construits (et elle se termine par une barre oblique inverse). –

+0

@BrianWalker On dirait que le dossier est créé seulement après la construction de la solution, cependant, il atteint le 'ItemGroup' avant cela, donc aucun fichier n'est trouvé. –

Répondre

2

trouvé la solution:

Créer une cible pour la création du groupe d'article:

<Target Name="ListWebConfigs" AfterTargets="BuildSolution"> 

    <ItemGroup> 
     <ConfigFiles Include="$(PublishFolder)\**\Web.config;$(PublishFolder)\**\NLog.config" 
        Exclude="$(PublishFolder)\**\Packages.config;$(PublishFolder)\**\*.*.config;$(PublishFolder)\**\bin\*.config" /> 
    </ItemGroup> 

    <Message Text="$(PublishFolder)" /> 
    <Message Text="@(ConfigFiles)" /> 

    </Target> 

Puis une autre pour les transformations réelles:

<!-- \x to prevent MSBuild from skipping "because all output files are up-to-date" --> 
    <Target Name="TransformWebConfig" AfterTargets="ListWebConfigs" Inputs="@(ConfigFiles)" Outputs="%(ConfigFiles.Identity)\x"> 

    <PropertyGroup> 
     <ConfigFile>%(ConfigFiles.Identity)</ConfigFile> 
     <BackupFile>$([System.IO.Path]::ChangeExtension($(ConfigFile),&quot;.Source.config&quot;))</BackupFile> 
     <TransformFilePrefix>$([System.String]::Concat($(TransformConfiguration), &quot;.config&quot;))</TransformFilePrefix> 
     <TransformFile>$([System.IO.Path]::ChangeExtension($(ConfigFile), $(TransformFilePrefix)))</TransformFile> 
    </PropertyGroup> 

    <Message Text="$(PublishFolder)" /> 
    <Message Text="@(ConfigFiles)" /> 

    <Message Text="$(ConfigFile)" /> 
    <Message Text="$(BackupFile)" /> 
    <Message Text="$(TransformFile)" /> 

    <Copy SourceFiles="$(ConfigFile)" DestinationFiles="$(BackupFile)" /> 

    <Exec Command="attrib -r $(ConfigFile)" /> 

    <TransformXml Source="$(BackupFile)" 
        Transform="$(TransformFile)" 
        Destination="$(ConfigFile)" 
        StackTrace="false" /> 

    </Target> 
+0

Vous devez marquer cela comme la réponse de sorte qu'il est évident que la question n'est pas en suspens. –

Questions connexes