2009-02-04 11 views
22

Ho una situazione in cui ho bisogno di copiare alcuni file specifici in uno script MSBuild, ma possono o non possono esistere. Se non esistono, va bene, quindi non ne ho bisogno. Tuttavia, l'attività standard <copy> genera un errore se non riesce a trovare tutti gli elementi nell'elenco ...MSBuild - come copiare file che possono o non possono esistere?

risposta

39

Utilizzare la condizione Ex. in Attività di copia.

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

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

Grazie! Mi ero dimenticato di questi! :) –

+7

Vale anche la pena ricordare che invece di '% (RootDir)% (Directory)% (Filename)% (Extension)', si può semplicemente usare '% (FullPath)' (vedere http://msdn.microsoft. it/it/us/library/ms171476.aspx) – AASoft

+0

Ricorda che quando si utilizza la trasformazione quando si fornisce 'SourceFiles', è necessario fornire la stessa trasformazione esatta in' Condizione' – patryk

5

Il modo più semplice sarebbe quella di utilizzare il flag 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> 

Ma se qualcosa è sbagliato che non se ne accorgeranno. Quindi la condizione esiste dalla risposta di madgnome sarebbe meglio.

0

Sembra che sia possibile contrassegnare MySourceFiles come SkipUnchangedFiles = "true" e non copierà i file se già esistono.