2014-02-14 2 views
5

Mit Blick auf die documentation for the Copy task sehe ich keine offensichtliche Möglichkeit, Dateien zu kopieren, ohne bestehende Dateien am Zielort zu überschreiben. Ich möchte nur neue Dateien kopieren.Wie wird ein MSBuild-Kopierbefehl ausgeführt, der vorhandene Dateien nicht überschreibt?

Was ich habe, so weit:

<ItemGroup> 
    <Packages Include=".nuget-publish\*.*" /> 
</ItemGroup> 

<Copy SourceFiles="@(Packages)" DestinationFolder="\\server\nuget\packages\" /> 
+0

Ah! Mit "Ich möchte nur neuere Dateien" ging ich davon aus, dass wir nach Datumsstempeln suchen, aber Sie möchten, dass die Kopie nur dann erfolgt, wenn die Zieldatei noch nicht existiert? – Nicodemeus

Antwort

4

In Ihrem Link gibt es ein Attribut "SkipUnchangedFiles". Fügen Sie das zur Kopieraufgabe hinzu und setzen Sie es auf "wahr".

<Copy SourceFiles="@(Packages)" DestinationFolder="\\server\nuget\packages\" SkipUnchangedFiles="true" /> 

EDIT: stelle ich mit dem folgenden ein Beispielprojekt auf.

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <ExistingPackages Include="dest\*.*" /> 
     <Packages Include="src\*.*" Exclude="@(ExistingPackages -> 'src\%(FileName)%(Extension)')" /> 
    </ItemGroup> 
    <Target Name="Build"> 
     <Message Text="PackagesToCopy @(Packages)" Importance="high" /> 
    </Target> 
</Project> 

Ordner + Datei Taxonomie ist:

src\ 
    doc1.txt 
    doc2.txt 
    doc3.txt 
    doc4.txt 
    doc5.txt 
    doc6.txt 
dest\ 
    doc2.txt 
    doc4.txt 
    doc6.txt 
CopyNew.proj 

Als ich msbuild.exe CopyNew.proj laufen, bekomme ich die folgende Ausgabe:

Build: 
    PackagesToCopy src\doc1.txt;src\doc3.txt;src\doc5.txt 

So, jetzt @ (Packages) enthält nicht mehr die Dateien, die im Zielordner vorhanden!

+1

Nicht dasselbe. Die Datei hat sich möglicherweise in der Quelle geändert, sollte aber nicht mehr überschrieben werden. Ich möchte die Datei nicht mit den Änderungen überschreiben. –

+0

Ihre Bearbeitung funktioniert. Vielen Dank. –

0

Die Option SkipUnchangedFiles="true" kopiert Dateien nur, wenn eine Quelldatei neuer als die Zieldatei ist.

Manchmal müssen Sie nur Dateien kopieren, die nicht im Zielordner vorhanden sind, ohne dass ein Dateidatumsvergleich durchgeführt wird. In diesem Fall können Sie Bedingung Kopieren Aufgabe verwenden:

<Copy SourceFiles="%(Packages.Identity)" DestinationFolder="$(TargetDir)" SkipUnchangedFiles="true" Condition="!(Exists(@(Packages->'$(TargetDir)%(Filename)%(Extension)')))" /> 
+0

Nur ein Hinweis, dass SkipUnchangedFiles eine Datei überspringen wird, "wenn sie die gleiche Größe und die gleiche letzte modifizierte Zeit haben" (laut Dokumentation). Das ist nicht das Gleiche wie 'Dateien nur dann kopieren, wenn eine Quelldatei neuer als die Zieldatei ist.' –

1

Bedingung Attribut verwendet werden kann, um Quelldateien zu filtern:

<Copy SourceFiles="@(SourceFiles)" DestinationFiles="$(DestinationPath)%(RecursiveDir)%(Filename)%(Extension)" Condition="!Exists('$(DestinationPath)%(RecursiveDir)%(Filename)%(Extension)')" /> 
Verwandte Themen