2009-04-14 8 views
1

Ich habe folgende Aufgabe, die durch die Kombination von DestinationFiles und DestionationFolder nicht funktioniert, aber es greift das Konzept von dem, was ich tun möchte:MSBuild rekursive Kopie mit% (ConfigurationToBuild.PlatformToBuild)

<CreateItem Include="$(Destination)\**\*.Generated.*.*"> 
    <Output TaskParameter="Include" ItemName="GeneratedFiles" /> 
</CreateItem> 

<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug-All' Or '%(ConfigurationToBuild.FlavorToBuild)'=='Release-WebService' " 
     SourceFiles="@(GeneratedFiles)" 
     DestinationFiles="@(GeneratedFiles-&gt;'%(RecursiveDir)%(Filename)%(Extension)')" 
     DestinationFolder="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" 
/> 

So habe ich eine Reihe von Dateien (Daten, nicht Code), die generiert werden, und diese müssen in den endgültigen Binärdateien Speicherort kopiert werden.

In diesem Build, ich baue 3 Konfigurationen auf einmal: eine Debug-All-Version, eine Release-Client-Version und ein Release-WebService. Die Gründe dafür sind, die gleiche Build-Nummer und exakt dieselbe Codebasis zu behalten, während die Client- und WebService-Projekte veröffentlicht und dann von den Setup-Projekten übernommen werden.

Wenn ich versuche zu verwenden: DestinationFiles = "@ (GeneratedFiles- >‚$ (BinariesRoot) \% (ConfigurationToBuild.PlatformToBuild) \% (ConfigurationToBuild.FlavorToBuild) \% (RecursiveDir)% (Dateiname)% (Erweiterung) ') "

MSBuild löst einen Fehler im% (ConfigurationToBuild.FlavorToBuild) -Teil aus.

Antwort

0

Ich habe eine Abhilfe für dieses Problem gefunden: d. H. Duplizieren Sie die Befehle manuell. So ist es weniger generisch und erzeugt noch mehr Rauschen in der Buildlog-Datei, aber zumindest funktioniert es!

<!-- Copy the updated files to the Binariesroot to have them picked up by the Setups --> 
<CreateItem Include="$(Destination)\**\*.Generated.*.sql"> 
    <Output TaskParameter="Include" ItemName="GeneratedSqlFiles" /> 
</CreateItem> 
<Message Text="[email protected](GeneratedSqlFiles)->RecursiveDir=%(RecursiveDir) Filename=%(Filename)%(Extension)" /> 

<CreateProperty Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug'" 
       Value="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" > 
    <Output TaskParameter="Value" PropertyName="RealBinariesRoot" /> 
</CreateProperty> 
<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='Debug'" 
     SourceFiles="@(GeneratedSqlFiles)" 
     DestinationFiles="@(GeneratedSqlFiles->'$(RealBinariesRoot)\Deployment\%(RecursiveDir)%(Filename)%(Extension)')" 
/> 
<CreateProperty Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='WebService'" 
      Value="$(BinariesRoot)\%(ConfigurationToBuild.PlatformToBuild)\%(ConfigurationToBuild.FlavorToBuild)" > 
    <Output TaskParameter="Value" PropertyName="RealBinariesRoot" /> 
</CreateProperty> 
<Copy Condition=" '%(ConfigurationToBuild.FlavorToBuild)'=='WebService'" 
     SourceFiles="@(GeneratedSqlFiles)" 
     DestinationFiles="@(GeneratedSqlFiles->'$(RealBinariesRoot)\Deployment\%(RecursiveDir)%(Filename)%(Extension)')" 
/> 

Auch in der Zwischenzeit gefunden, dass, wenn Sie ein '.' in dem Weg einer CreateItem Aufgabe einschließt, wird die RecursiveDir Eigenschaft nicht gefüllt mehr in

'Laufwerk: \ somefolder \ Unterordner \ sources \ generiert *** generiert * sql...' So

hat. das% liefern (RecursiveDir) Metadaten.

Verwendung Fahrt:. \ Somefolder \ Unterordner \ \ Sources \ generiert *** generiert * sql... ', Die NICHT die% (RecursiveDir) Metadaten zur Verfügung stellt, wie oben auf den gleichen Pfad aufgelöst wird. (beachten Sie das feine '.' zwischen Unterordner und Sources)

Natürlich (Murphys Gesetz) benutzen wir dies, um anzugeben, welche Verzweigung benötigt wird, mit. auf den Hauptzweig zeigend ;-)