2009-07-06 21 views
10

TFS üzerinde oluşturmaya çalıştığım bir çözüm var. Tüm uygun dosyaların sürümlerini güncellemek istiyorum ve bunu yapmak için uğraştım. Nasıl yapılacağına dair pek çok bağlantı var, ama bunların hiçbiri benim için değil, küçük bir sorun yüzünden.ItemGroup Öğe kapsamı, alternatif olarak "MSBuild neden benden nefret ediyor?"

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
    <Target Name="DesktopBuild"> 
     <CallTarget Targets="GetFiles" /> 

     <Message Text="CSFiles: '@(CSFiles)'" /> 
    </Target> 

    <Target Name="GetFiles"> 
     <ItemGroup> 
      <CSFiles Include="**\AssemblyInfo.cs" /> 
     </ItemGroup> 
     <Message Text="CSFiles: '@(CSFiles)'" /> 
    </Target> 
</Project> 

Benim ağaç şöyle görünür:

  • test.proj
  • application.sln
  • uygulama (Klasör)
    • main.cs
    • Özellikleri (Klasör)
      • AssemblyInfo.cs

koşuyorum "c: \ Windows \ Microsoft.NET \ v3.5 \ MSBuild.exe test.proj Framework \" çözüm klasöründen ... Ben olsun aşağıdaki çıkışı:

Microsoft (R) Build Engine Version 3.5.30729.1 
[Microsoft .NET Framework, Version 2.0.50727.3074] 
Copyright (C) Microsoft Corporation 2007. All rights reserved. 

Build started 7/6/2009 3:54:10 PM. 
Project "D:\src\test.proj" on node 0 (default targets). 
    CSFiles: 'application\Properties\AssemblyInfo.cs' 
DesktopBuild: 
    CSFiles: '' 
Done Building Project "D:\src\test.proj" (default targets). 


Build succeeded. 
    0 Warning(s) 
    0 Error(s) 

Time Elapsed 00:00:00.04 

Peki benim ItemGroup yapabilirsiniz küresel kapsama sahip? Derleyici ve TeamBuild tarafından kullanılan tüm Hedefler dosyaları aynı şeyi yapıyor ve hepsi de küresel görünüyor ... Neden bunun benim için çalışmıyor olduğunu anlamıyorum.

Herhangi bir yardım?

+0

Test.proj dosyasını oluşturmaya çalışıyor musunuz? AssemblyInfo.cs'u neden proje dosyası üzerinden oluşturmaya çalıştığınızı anladığınızdan emin değilim. –

+0

Test.proj dosyasını, sorunumu gösteren en az bir örnek olarak oluşturdum. Gerçekte, çoklu çözüm dosyamı TFS'de oluşturmaya çalışıyorum. Bu sadece ItemGroups ve Hedeflerinde görüyorum kapsam belirleme davranışını göstermek içindir. –

+0

Keşke yardım etmeye çalışan bütün insanları kışkırtmak isterdim, ama görünüşe göre ben de 'newb' oldum. Sadece bir notu düşürmek istedim, burada herkesin harcadığı zamanı takdir ediyorum ve bunu düşünüyorum. –

cevap

9

CallTarget yerine DependsOnTarget kullanmayı denediniz mi? CallTarget'ın konuya neden olması olabilir.

+0

Tamam, bu bana biraz daha bilgi veriyor gibi görünüyor. DependsOn kullanarak ItemGroup'un kapsamını değiştirebilirim, ancak tutarlı görünmüyor. Görünüşe göre bağımlı grupların kardeşleri, item grubuna erişim hakkına sahipler, ancak ebeveyn asla yapmaz. Çok garip. Kapsam kurallarını gösteren herhangi bir yer var mı? Onları bulamadım ve sanırım şimdi dosyalarımı değil, karmaşık bağımlılıkları kullanarak dosyalarımı yeniden yazmam gerekiyor. Bu çok çılgın. –

+0

Hiç görmedim. ItemGroup’u Hedefler’in tamamen dışına taşımayı denediniz mi? Bunu yapmak istememen için bir sebep var mı? – technophile

+0

Veya dışarıda başlatmak için başlatır (Include ile kesmek = "*. WontExist") –

0

Yapımıza benzer bir şey yapıyoruz. Sürümü bir komut satırı parametresi olarak aktarıyoruz. Bizim TFSBuild.proj olarak

hiçbir sürüm sağlanmadı ise 0.0.0.0 olarak versiyonunu ayarlayın:

<!--Our assembly version. Pass it in from the command prompt like this: /property:Version=1.0.0.0--> 
<PropertyGroup> 
    <Version>0.0.0.0</Version> 
</PropertyGroup> 

<PropertyGroup> 
    <!--Used to ensure there is a newline before our text to not break the .cs files if there is no newline at the end of the file.--> 
    <newLine>%0D%0A</newLine> 

bu Sonra yapın:

<Target Name="BeforeCompile"> 
    <!--Update our assembly version. Pass it in from the command prompt like this: /property:Version=1.0.0.0--> 

    <!--attrib needs to be run first to remove the read only attribute since files from tfs are read only by default.--> 
    <Exec Command='attrib -R $(SolutionRoot)\Source\Project\GlobalAssemblyInfo.cs' /> 

    <WriteLinesToFile File="$(SolutionRoot)\Source\Project\GlobalAssemblyInfo.cs" 
         Lines='$(newLine)[assembly: AssemblyVersion("$(Version)")]'/> 

</Target> 
+2

Sadece FYI, Varolanlar bu kodun yapmasını beklediği gibi görünmüyor. Adlandırılmış dosyanın var olup olmadığını, adlandırılmış değişkenin var olup olmadığını kontrol eder. Muhtemelen Koşul = "'$ (Sürüm)' == ''" yerine ". Bkz. Http://msdn.microsoft.com/en-us/library/7szfhaft.aspx – technophile

+0

Bu teknisyen adam akıllıdır. :-) O ne dedi. Doc standart yolu, tek tırnak işaretleri ile çevrelemek ve etrafında bol miktarda boşluk koymak ... Ayrıca, bu yöntem benim için harika değil . MSBuild topluluk görevleri yöntemlerini öznitelik ve regex dosyalarını güncellemek için tercih ederim. Sorunum dinamik yerlere sahip olduğum için güncelleme yapmak için dosya listesini oluşturuyor. Yine de teşekkürler. :-) –

+0

Teşekkürler Chris. :) CI ortamımızda bir sürü çalışma yapmanın ortasındayız, bu yüzden aklımda bu çok taze. ;) – technophile

5

önceki yorumcu doğruydu, şunları yapmalısınız CallTarget görevini kullanmak yerine DependsOnTargets kullanmak için bunu değiştirin. Gördüğünüz, bir kapsam sorunu değil bug. way to avoid bu hata DependsOnTargets kullanmaktır (ki bu çok daha iyi bir yaklaşımdır anywayz).

Sayed Ibrahim Haşimi

My Kitap: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Gerçekten bir hata mı? [Burada] sunulan açıklama (http://blogs.msdn.com/b/aaronhallberg/archive/2007/07/16/msbuild-property-evaluation.aspx) eşit derecede zorlayıcıdır ve bunun gerçek olduğu doğrulanmıştır. Hala bu nasıl çalışır, birkaç yıl sonra. –

+0

Bir hata lütfen http://blogs.msdn.com/b/msbuild/archive/2006/01/03/508629.aspx adresini ziyaret edin. –

1

olarak, DependsOnTargets kullanmak gerektiğini söyledi. MSBuild kapsamı hakkında bir araştırma yaptım, sonuçlarımı blogumda bulabilirsiniz: http://blog.qetza.net/2009/10/23/scope-of-properties-and-item-in-an-msbuild-script/

Projenin küresel bir kapsamı ve hedef için yerel bir kapsam olduğu görülmektedir. Hedefi girerken, global kapsam kopyalanır ve hedeften çıkarken yerel kapsam tekrar birleştirilir. Dolayısıyla, bir CallTarget, değiştirilmiş yerel kapsam değerlerini alamaz ancak DependsOnTargets, ikinci hedefe girmeden önce ilk hedeften çıkılır.