MSBuild ItemGroup leeg na opschonen

Ik zie wat vreemd gedrag met de tag ItemGroup .

Mijn applicatie is afhankelijk van verschillende DLL's en ik kopieer deze DLL's en het uitvoerbare bestand naar een implementatiemap, die door NSIS wordt gebruikt om een ​​installatiepakket van een nieuwe versie te maken. Ik kom hier echter een vreemde kwestie tegen.

Ik definieer mijn ItemGroup als volgt (bovenaan het bestand voordat ik mijn builddoel definieer:


Dus, dit grijpt alle DLL's in de directory en de binaire MyApp.exe . Maar als het project is opgeschoond (d.w.z. er zijn geen bestanden in $ (OutputPath) ). De DLL's zijn niet opgenomen in de ItemGroup -lijst met bestanden. Als ik dit nu volg met een andere build (d.w.z. er zijn bestanden van de vorige build in $ (OutputPath) ), bevat de ItemGroup alle gewenste bestanden.

Ook heb ik de uitvoer van het build-script gecontroleerd en de DLL's gekopieerd naar $ (OutputPath) of een opschoning wel of niet is gebeurd.

Dus mijn vraag is, hoe verbeter ik mijn build-script zodanig dat ItemGroup altijd de DLL's bevat? Het lijkt erop dat de ItemGroup wordt gevuld met bestanden voordat de build plaatsvindt, dus als de bestanden niet vóór de build staan, zijn ze niet opgenomen in de lijst, maar als ze al bestaan ​​vóór de build, dan zijn ze zijn.

Ter referentie: hier is het builddoel dat ik gebruik:


    ..\MyApp
    $(MyAppRoot)\MyApp.csproj



    
    
      
    
    
  
1

1 antwoord

Presumably your item array is declared at the root level in your project, in xml as a child of the element. This means that MSBuild will evaluate the membership in the item array when the project file is first loaded. Whether or not the existance of those files changes during execution is irrelevant. If you want to populate the item array at a particular point in your build, you need to change the declaration from a static item array to a dynamic one, which means moving it inside a target, to the exact spot where you want to gather the files, as:


   ...before message
   ...msbuild task
   
      
      
   
   ...after message

(uittreksel uit trick # 62 in het boek " MSBuild Trickery ")

9
toegevoegd
Wauw, bedankt daarvoor. Ik wist niet dat je dat kon doen, ik heb altijd CreateItem gebruikt
toegevoegd de auteur Preet Sangha, de bron
Bedankt! Ik kwam toevallig op een niet-gerelateerd probleem op SO dat dit deed. Dit lost mijn probleem op! Ik zal de jouwe als het antwoord na 3 minuten markeren: D
toegevoegd de auteur mevatron, de bron
Het klinkt alsof ik dat boek moet lezen :)
toegevoegd de auteur mevatron, de bron
Zeer nuttige tip :)
toegevoegd de auteur Pol, de bron
CreateItem was de enige manier om het terug te doen in 2.0, maar in de woorden van iemand-die-zal-blijven-naamloos in het MSBuild-team, wordt het nu beschouwd als een "gruwel" :)
toegevoegd de auteur Brian Kretzler, de bron
Bedankt! Ik heb net een uur besteed aan het proberen uit te zoeken waarom mijn kopieertaak niets zou kopiëren ... Uit om je boek nu te kopen.
toegevoegd de auteur lesscode, de bron