MSBuild ItemGroup Clean'den sonra boş

ItemGroup etiketiyle bazı garip davranışlar görüyorum.

Uygulamam birkaç DLL'ye bağlı ve bu DLL'lerin yanı sıra NSIS tarafından yeni bir derlemeden bir yükleme paketi oluşturmak için kullanılan bir dağıtım dizinine uygulanabilir. Ancak, bu konuda garip bir sorunla karşılaşıyorum.

ItemGroup sayfamı şu şekilde tanımlarım (derleme hedefimi belirlemeden önce dosyanın üstünde:


Bu nedenle, bu dizindeki tüm DLL'leri ve MyApp.exe ikili dosyalarını alır. Ancak, proje temizlenmişse (örneğin, $ (OutputPath) 'da dosya yoktur). DLL dosyaları ItemGroup listesine dahil edilmedi. Şimdi, bunu başka bir derleme ile takip edersem (ör. $ (OutputPath) 'da önceki derlemeden dosyalar var) ItemGroup istediğim tüm dosyaları içeriyor.

Ayrıca, derleme betiğinin çıktısını kontrol ettim ve DLL'ler temiz olup olmadığına göre $ (OutputPath) 'a kopyalandı.

Öyleyse sorum şu, derleme betiğimi nasıl ItemGroup her zaman dll içerecek şekilde düzeltirim? Derleme gerçekleşmeden önce ItemGroup dosyalarla doluyor gibi görünüyor, bu nedenle dosyalar derlemeden önce yoksa, listeye dahil edilmezler, ancak derlemeden önce varsa vardır.

Başvuru için, burada kullanıyorum yapı hedefi:


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



    
    
      
    
    
  
1

1 cevap

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

(" MSBuild Trickery " kitabındaki 62. numaradan alıntılanmıştır.)

9
katma
Vay - bunun için teşekkürler. Bunu yapabileceğini bilmiyordum, her zaman CreateItem'i kullandım.
katma yazar Preet Sangha, kaynak
Teşekkürler! Ben sadece bunu yapan SO ile ilgisiz bir problem üzerine oldum. Bu benim sorunumu çözdü! Sizinkini 3 dakika sonra cevap olarak işaretleyeceğim: D
katma yazar mevatron, kaynak
Bu kitabı okumam gerekiyor gibi geliyor :)
katma yazar mevatron, kaynak
Çok yararlı bir ipucu :)
katma yazar Pol, kaynak
CreateItem, 2.0'da geri dönmenin tek yoluydu, ancak MSBuild ekibinde isimsiz kalan birinin sözleriyle, artık "kötüye kullanım" olarak kabul ediliyor :)
katma yazar Brian Kretzler, kaynak
Teşekkürler! Sadece bir saatimi, Kopya görevimin neden bir şey kopyalamadığını anlamaya çalışmakla ... Kitabınızı şimdi almak için.
katma yazar lesscode, kaynak