2016-02-10 1 views
0

J'écris un fichier de configuration MSBuild target/xml.Les dossiers récursivement copiés dans MSBuild sont incorrectement copiés dans un dossier

Disons que j'ai deux dossiers dans mon dossier source du projet que je veux copier. Je souhaite copier uniquement ces dossiers (et leur contenu) et ignorer les autres dossiers.

La spécification ci-dessous copie les fichiers corrects, mais ils sont tous simplement exportés dans un dossier. Les deux dossiers de niveau supérieur (bin et obj) sont perdus et leur contenu est simplement combiné dans un dossier.

Je veux fondamentalement copier les deux dossiers dans le nouveau dossier de niveau supérieur, exactement comme ils et leur contenu sont.

Script

<Target Name="Package" DependsOnTargets="Build"> 
    <Message Text="Copying."></Message> 
    <ItemGroup> 
     <PackagedFiles Include="$(PipelineFolder)MyFolder\bin\**; 
           $(PipelineFolder)MyFolder\obj\**" /> 
    </ItemGroup> 

    <MakeDir Directories="$(PipelineFolder)CopiedFolder" /> 
    <Copy SourceFiles="@(PackagedFiles)" DestinationFolder="$(PipelineFolder)CopiedFolder\%(RecursiveDir)%(Filename)%(Extension)" /> 

</Target> 

Quelle est la meilleure façon de copier uniquement les dossiers de niveau supérieur, je suppose que le caractère générique dans les PackagedFiles pointent vers tout ce qui est de ces dossiers. Je ne peux pas faire cela à partir du dossier au-dessus du répertoire de travail car alors je vais copier tous les autres dossiers (pas seulement ceux que je veux, bin et obj).

Merci.

Répondre

1

Vous pouvez utiliser le traitement par lots pour cela. La première cible définit les dossiers à inclure et la deuxième cible définit d'abord ces dossiers avec l'attribut DependsOnTargets. L'attribut Outputs indique à MSBuild d'utiliser le traitement par lots pour cette cible.

<Project DefaultTargets="CopyPackageFolders" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="14.0"> 

<Target Name="DefinePackageFolders"> 
    <ItemGroup> 
     <PackageFolders Include="bin"/> 
     <PackageFolders Include="obj"/> 
    </ItemGroup> 
</Target> 

<Target Name="CopyPackageFolders" DependsOnTargets="DefinePackageFolders" Outputs="%(PackageFolders.Identity)"> 
    <Message Text="Copying %(PackageFolders.Identity)" /> 
    <PropertyGroup> 
     <TargetSubFolder>%(PackageFolders.Identity)</TargetSubFolder> 
    </PropertyGroup> 
    <ItemGroup> 
     <Files Include="$(PipelineFolder)MyFolder\%(PackageFolders.Identity)\**" /> 
    </ItemGroup> 
    <MakeDir Directories="$(PipelineFolder)CopiedFolder\%(PackageFolders.Identity)" /> 
    <Copy SourceFiles="@(Files)" DestinationFiles="$(PipelineFolder)CopiedFolder\$(TargetSubFolder)\%(RecursiveDir)%(Filename)%(Extension)" /> 
</Target> 

</Project> 

Note: Vous devez envelopper %(PackageFolders.Identity) dans une propriété séparée parce que vous ne pouvez pas utiliser deux itemgroups différents dans l'attribut DestinationFiles.

Disons que vous avez les données d'entrée suivantes:

C:\PipelineFolder\MyFolder\bin\bin.txt 
C:\PipelineFolder\MyFolder\obj\obj.txt 

Supposons que le script fourni est situé dans C:\test.proj Ensuite, vous appelez le script avec une propriété PipelineFolder donné.

C:\> msbuild test.proj /p:PipelineFolder=C:\PipelineFolder\ 

L'ensemble du fichier résultant serait:

C:\PipelineFolder\CopiedFolder\bin\bin.txt 
C:\PipelineFolder\CopiedFolder\obj\obj.txt 
+0

Merci pour la réponse! – dahui

+0

Désolé, je viens juste de faire le tour, j'ai dû mettre le projet en attente. Ce n'est pas tout à fait efficace, car il ne reste plus qu'à balayer tous les fichiers correspondants dans un répertoire, donc je l'ai annulé comme réponse pour l'instant. Est-il important d'avoir les "DefinePackageFolders" et "CopyPackageFolders" dans des cibles séparées? – dahui

+0

Il est un peu plus près de travailler, mais il met toujours tous les fichiers dans un de mes dossiers imbriqués (le deuxième dossier "obj") – dahui