2010-10-22 33 views
10

Bu yöntemlerden birini kullanarak özellikleri oluşturmak mümkündür:MsBuild'de, CreateProperty ve PropertyGroup arasındaki fark nedir?

<Target Name="A"> 
    <PropertyGroup> 
     <DogSound>Bark</DogSound> 
    </PropertyGroup> 
</Target> 

<Target Name="B"> 
    <CreateProperty Value="Bark"> 
     <Output TaskParameter="Value" PropertyName="DogSound"/> 
    </CreateProperty> 
</Target> 

Ancak, bir şey varsa A ve B hedefleri arasındaki fark nedir?

Teşekkürler.


Not: Ben msbuild 3.5 kullanıyorum. PropertyGroup sözdiziminin msbuild'in önceki sürümlerinde bir hedef içinde çalışmadığına inanıyorum, ancak ItemGroups ile aynıydı. CreateItem kullanımdan kaldırıldı, ancak CreateProperty yapmadı, bu yüzden de CreateProperty'nin PropertyGroup kullanımı üzerinde hala bir şey olup olmadığını ve eğer öyleyse, ne olduğunu merak ediyorum.

+2

İçerideki kullanarak hedeflediğim bir sorun Mono'da desteklenmediğidir: http://www.mono-project.com/Microsoft.Build Görünüşte CreateProperty düzgün çalışıyor ... –

cevap

7

MSBuild 4.0 CreateProperty & CreateItem kullanmayın. Bunun yerine ItemGroup ve PropertyGroup'u doğrudan hedefin içine yerleştirin.

MSBuild 3.5 ItemGroup/PropertyGroup hedeflerinin içinde izin verilmeden önce haklısınız, böylece kullanıcıların kullanacağı CreateProperty & CreateItem görevleri vardı. MSBuild 3.5'den sonra sadece ItemGroup & PropertyGroup'u kullanmalısınız. Orada hala CreateProperty & CreateItem gerekebilir bazı ekstrem köşe durumlarda vardır, ama olsa ben o dert olmaz. Bu senaryolar kaçmak ve CreateItem'in daha az kısıtlayıcı olan ItemGroup ile nasıl başa çıktığını ele alır. Ama gerçekte, insanların% 99'u buna karşı çıkmayacak.

+0

için teşekkürler Cevabınız, PropertyGroup'a sadık kalacağım. Ancak, gerçekten insanların karşılaşacağı farkın% 1'ini soruyordum. PropertyGroup'un yapamayacağı ve CreateProperty'nin gerekli olduğu köşe durumları nelerdir? –

+0

@ScottLangham bir örnek diğer hedeflerden erişilebilen özellikler oluşturacaktır ([bu yazıya bakın] (http://stackoverflow.com/questions/1366840/overwrite-properties-with-msbuild) –

+1

Kullanabileceğim tek zaman Yeni adın yalnızca çalışma zamanında bilinmesi durumunda 'CreateItem' veya' CreateProperty' kullanılır. – Eris

0

bu iki hedeflerin davranışa arasında hiçbir fark yoktur. Yani hatta remain the case hem sonunda CallTarget görev katacak eğer: $(DogSound) denilen hedefte için "Bark" değerlendirmek olmaz! Aşağıdaki değişikliklerden birini B hedef yaparsanız

Ancak, bir fark olacaktır. PropertyGroup kullanılarak da yapılabilir.

  • Target elemana Input ve Output özellikler ekleyin ve TaskParameter="ValueSetByTask" için TaskParameter="Value" değiştirin. Son değişiklik, çıktıları girişlerine göre güncel olduğundan dolayı B hedef atlandığında preventDogSound 0 "Bark" olarak ayarlanmış olur. Dinamik bir değere
  • Değişim "DogSound" (özellik adı).

(ItemGroup karşı CreateItem soruya cevap basit çünkü, bunu hitap edecek bir parçası olmamasına rağmen. In-hedefe ItemGroup tek seçenektir bir CreateProperty aksine, CreateItem yüzden kullanılarak kaldırılmıştır.)

İlgili konular