2009-02-04 6 views
22

J'ai une situation où j'ai besoin de copier quelques fichiers spécifiques dans un script MSBuild, mais ils peuvent exister ou non. S'ils n'existent pas c'est bien, je n'en ai pas besoin alors. Mais la tâche standard <copy> génère une erreur si elle ne trouve pas tous les éléments de la liste ...MSBuild - comment copier des fichiers qui peuvent exister ou non?

Répondre

39

Utiliser la Existe en tant que condition sur la tâche de copie.

<CreateItem Include="*.xml"> 
    <Output ItemName="ItemsThatNeedToBeCopied" TaskParameter="Include"/> 
</CreateItem> 

<Copy SourceFiles="@(ItemsThatNeedToBeCopied)" 
     DestinationFolder="$(OutputDir)" 
     Condition="Exists('%(RootDir)%(Directory)%(Filename)%(Extension)')"/> 
+1

Merci! J'avais oublié ça! :) –

+7

Il vaut aussi la peine de mentionner qu'au lieu de '% (RootDir)% (Directory)% (Filename)% (Extension)', on peut simplement utiliser '% (FullPath)' (voir http://msdn.microsoft. com/fr-fr/library/ms171476.aspx) – AASoft

+0

Notez que lorsque vous utilisez la transformation en fournissant 'SourceFiles', vous devez fournir exactement la même transformation dans' Condition' – patryk

5

Le plus simple serait d'utiliser le drapeau ContinueOnError http://msdn.microsoft.com/en-us/library/7z253716.aspx

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

    <ItemGroup> 
     <MySourceFiles Include="a.cs;b.cs;c.cs"/> 
    </ItemGroup> 

    <Target Name="CopyFiles"> 
     <Copy 
      SourceFiles="@(MySourceFiles)" 
      DestinationFolder="c:\MyProject\Destination" 
      ContinueOnError="true" 
     /> 
    </Target> 

</Project> 

Mais si quelque chose d'autre est faux, vous ne le remarquez pas. Donc la condition existe de la réponse de madgnome serait mieux.

0

Il semble que vous pouvez marquer MySourceFiles comme SkipUnchangedFiles = "true" et qu'il ne copiera pas les fichiers s'ils existent déjà.

Questions connexes