Frage

Ich habe versucht, eine Aufgabe zu machen in meinem TFS allgemeineren baut, und eines der Dinge, die ich zu tun versuche, ist, einige Dateien in andere Verzeichnisse kopieren auf dem Build je die Aufgabe verwenden. Ich spielte mit dem Gedanken Eigenschaften, aber ich konnte nicht denken Sie an eine Art und Weise, dass sauber zu tun, also habe ich versucht, mit der Verwendung von Artikel-Metadaten zu gehen, da ich in der Lage gewesen, so an einem anderen Ort in der gleichen Zieldatei zu tun ich arbeite an, nur dieses Mal, ich möchte Eigenschaften verwenden.

Hier ist, was ich tun möchte:

<ItemGroup>
  <DestinationParent Include="$(DeploymentPath)">
    <DestinationParentPath>$(DeploymentPath)</QuartzParentPath>
  </DestinationParent>
</ItemGroup>

Und später in der Build habe ich versucht, durch Verweisen auf das Element Metadaten einige Dateien in den Zielordner zu kopieren:

<Copy SourceFiles="@(FilesToCopy)" DestinationFiles="@(FilesToCopy-&gt;'%(DestinationParentPath)\Destination\%(RecursiveDir)%(Filename)%(Extension)')" ContinueOnError="false" ></Copy>

Leider ist nach dem Build-Läufe, meine BuildLog zeigt folgende Möglichkeiten:

Copying file from "$(BinariesRoot)\%(ConfigurationToBuild.FlavorToBuild)\<File being copied>" to "\Destination\<File being copied>".

% (DestinationParentPath) hatte aus irgendeinem Grund auf einen leeren String, erweitert. Mit% (DestinationParent.DestinationParentPath) erzeugt einen Fehler, mir zu sagen, dass ich einfach% (DestinationParentPath) werden. $ (DeploymentPath) auf die richtige Zeichenfolge erweitert, wie in mehreren anderen Orten in der Build erwartet.

Eine weitere Quelle der Verwirrung ist, dass unter Verwendung von% (ConfigurationToBuild.FlavorToBuild) den korrekten Wert ergab, das heißt zu testen, kann wie im folgenden zu sehen:

EDIT: Dies ist unter dem Wurzelknoten Projekt definiert, während die ItemGroup mit DestinationParentPath unter einem Zielknoten festgelegt. Gilt das auch einen Unterschied machen?

<ItemGroup>
  <ConfigurationToBuild Include="Test|Any CPU">
    <FlavorToBuild>Test</FlavorToBuild>
    <PlatformToBuild>Any CPU</PlatformToBuild>
  </ConfigurationToBuild>
</ItemGroup>

Es scheint nicht, als ob das Include-Attribut relevant ist, wenn Sie daran interessiert sind nur in der Zeichenfolge in dem Produkt Metadaten sind, da ich ziemlich sicher bin, „Test | Jede CPU“. Referenz keine tatsächliche Datei

Also noch einmal, warum% (DestinationParentPath) auf einen leeren String erweitern?

EDIT:. Ich habe vergessen zu erwähnen, dass ich auch hart codierte den tatsächlichen Pfad für DestinationParentPath versucht, aber diese noch in% (DestinationParentPath) Expandieren auf einen leeren String führte

War es hilfreich?

Lösung

  

EDIT: Dies ist unter dem Wurzelknoten Projekt definiert, während die ItemGroup mit DestinationParentPath unter einem Zielknoten festgelegt. Gilt das auch einen Unterschied machen?

Ja, es macht einen Unterschied. Die Fähigkeit, eine ItemGroup innerhalb eines Ziels zu definieren ist neu 3,5 bis msbuild. Trotz der Suche deklarativen, ist es tatsächlich zur Laufzeit ausgeführt, als ob Sie die alten Stil CreateItem / Create Aufgaben genannt haben. Das allein führt zu möglichen Problemen: Sie berücksichtigen müssen, wenn die enthaltende Aufgabe ist (erste) genannt. Reihenfolge der Vorgänge mit dem bloßen nicht immer offensichtlich ist Auge . klug sein kann, die Aufgabe zu machen, wo man% (DestinationParentPath) abhängig von der Aufgabe verwenden, wo es erstellt wird, auch wenn es keine „logische“ Abhängigkeit ist.

Darüber hinaus gibt es die uralten msbuild Scoping Macken / Bugs. Dynamisch erstellte Objekte und Elemente sind nicht sichtbar Aufgaben „Geschwister“ . Auch Elemente in verschachtelten aktualisiert Builds sind nicht immer sprudelte .

Überprüfen Sie die Abhilfen in den Links, sollten Sie in der Lage sein, etwas zu finden, das für Sie arbeitet, auch wenn es kitschig ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top