Domanda

Ho cercato di rendere più generica un'attività nella mia build TFS e una delle cose che sto cercando di fare è copiare alcuni file in directory diverse a seconda della build che utilizza l'attività. Ho giocato con l'idea di usare le proprietà, ma non riuscivo a pensare a un modo per farlo in modo pulito, quindi ho provato ad usare i metadati degli oggetti, dato che sono stato in grado di farlo in un altro posto nello stesso file di destinazione Sto lavorando, solo questa volta, mi piacerebbe usare le proprietà.

Ecco cosa voglio fare:

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

E più avanti nella build, ho provato a copiare alcuni file nella cartella di destinazione facendo riferimento ai metadati dell'elemento:

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

Sfortunatamente, dopo l'esecuzione della build, il mio BuildLog mostra quanto segue:

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

% (DestinationParentPath) si era espanso in una stringa vuota, per qualsiasi motivo. L'uso di% (DestinationParent.DestinationParentPath) ha prodotto un errore, che mi ha detto che avrei dovuto semplicemente usare% (DestinationParentPath). $ (DeploymentPath) viene espanso nella stringa corretta come previsto in molti altri punti della build.

Un'altra fonte di confusione è che l'uso di% (ConfigurationToBuild.FlavorToBuild) ha prodotto il valore corretto, ovvero Test, come si può vedere nel seguito:

EDIT: questo è definito sotto il nodo principale Progetto, mentre ItemGroup con DestinationParentPath è definito sotto un nodo Target. Anche questo fa la differenza?

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

Non sembra che l'attributo Includi sia rilevante quando sei interessato solo alla stringa nei metadati dell'elemento dato che sono abbastanza sicuro " Test | Qualsiasi CPU " non fa riferimento a nessun file reale.

Quindi, ancora una volta, perché% (DestinationParentPath) si sta espandendo in una stringa vuota?

EDIT: ho dimenticato di dire che ho anche provato a codificare il percorso effettivo di DestinationParentPath, ma ciò ha comportato comunque l'espansione di% (DestinationParentPath) in una stringa vuota.

È stato utile?

Soluzione

  

EDIT: questo è definito sotto il nodo principale Progetto, mentre ItemGroup con DestinationParentPath è definito sotto un nodo Target. Anche questo fa la differenza?

Sì, fa la differenza. La capacità di definire un gruppo di oggetti all'interno di una destinazione è una novità di msbuild 3.5. Nonostante sembri dichiarativo, in realtà viene eseguito in fase di esecuzione proprio come se avessi chiamato le attività CreateItem / CreateProperty di vecchio stile. Questo da solo porta a potenziali problemi: è necessario considerare quando viene chiamata (per prima) l'attività di contenimento. L'ordine delle operazioni non è sempre ovvio per i nudi occhio . Può essere saggio rendere l'attività in cui si utilizza% (DestinationParentPath) in base all'attività in cui è stata creata, anche se non è presente alcuna "logica" dipendenza.

Inoltre, ci sono le stranezze / bug dell'ambito msbuild. Proprietà e ampli creati dinamicamente; gli articoli non sono visibili a " fratello " compiti . Inoltre, articoli aggiornati in nidificati le build non sono sempre gorgogliate .

Dai un'occhiata alle soluzioni alternative nei link, dovresti essere in grado di trovare qualcosa che funzioni per te anche se è dannoso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top