2010-04-15 18 views
14

MSBuild için oldukça yeni ve hem VS2010 hem de TFS2010'da oluşturduğum bir Wpf proje dosyasına biraz özelleştirme yapıyorum. Bu masaüstünde oluştururken bana merkezi ikili dizine oluşturmanızı sağlar

<OutputPath Condition=" '$(TeamBuildOutDir)' == '' ">$(SolutionDir)build\binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath> 
<OutputPath Condition=" '$(TeamBuildOutDir)' != '' ">$(TeamBuildOutDir)binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath> 

ve CI çalıştıran oluşturduğunda ikilileri bulmak için TFS sağlar: aşağıdaki gibi ben çıkış yolunu özelleştirilmiş ettik. Ancak, her iki durumda da $ (ProjectDir) özelliğinin '' yapım süresinde '' değerlendirdiği görülüyor ki bu da garip sonuçlar doğuruyor. Bazı hata ayıklama yapmak, BeforeBuild yürütme zamanı tarafından $ (ProjectName) ayarlanmış gibi görünür, ancak OutputPath özelliğim bu noktadan önce değerlendiriyormuş gibi görünür.

<ProjectNameUsedTooEarly Condition=" '$(ProjectName)' == '' ">true</ProjectNameUsedTooEarly> 

Önceki özellik, OutputPath özelliği ile aynı özellik grubundadır. BeforeBuild hedefinde, $ (ProjectNameUsedTooEarly) doğru olarak değerlendirir, ancak $ (ProjectName) proje noktası için bu noktaya normal olarak değerlendirir.

Kullandığımda $ (ProjectName) değeri aldığından emin olmak için neler yapabilirim?

düzenleme: Sadece benim yapı dosyası üzerinden hata ayıklamak için Attrice en MSBuild Sidekick kullanılan ve kesme noktası için ilk hedefin mevcut (_CheckForInvalidConfigurationAndPlatform) tüm özellikler zaten ayarlanmış gibi görünüyor. ProjectName zaten doğru şekilde ayarlanmış, ancak OutputPath özelliği zaten ProjectName boş değeri kullanılarak ayarlanmış.

cevap

24

Hmm - o da csproj yeri var - $ (MSBuildProjectDir) kullan - karışıklık biraz ben

  1. $ kullanmayın (ProjectDir) sıralamak için çalışacağım orada hangi oluyor kaynak ağacı ve MSBuild.exe tarafından ayrılmış bir özellik olarak ayarlanır. Ben (ProjectDir) Microsoft.Common.Targets (Microsoft.Csharp.targets tarafından yapılır) alındıktan sonra kullanılabilir olduğunu düşünmüyorum. Mülkün değerlendirmesi, tüm İthalatlar tamamlandığında değil, her zaman dosya içinde "yerinde" gerçekleştirilir. Eğer SideKick aracında geçerli olarak mülk bu nedenle görüyorsunuz olarak (

  2. Aynı şekilde VS2010 ve TFS2010 konusunda emin değilim

  3. (sorununuzu çözmek olacağını düşündüğümüz olan) $ (MSBuildProjectName) kullanan açıklayabilir Bu MSBuild 4.0 kullanıyor ve hiç şüphesiz yeni bir TeamBuild kullanıyor), ancak 2008'de, derlemenizin bir komut satırı/IDE yapısı veya TeamBuild içinden çağrılıp çağrılmadığını anlamak için bir .csproj içinde oldukça zor. Söylemeye çalıştığım şey, $ (TeamBuildOutDir) csproj'unuzun içinde olduğunu düşünmüyorum. Teambuild, proje dosyanızı çağırdığında aktarılırken normal olarak $ (TeamBuildConstants) özelliğini test ederim. YMMV Ben

+0

Evet, haklısın .. 2010 ile oynanan henüz gibi - ProjectDir ayarlanır (doğrudan MSBuildProjectDir gelen, aslında) Microsoft.Common.Targets içinde. Bunu araştırırken bulduğum çok şey var. Sanırım kendi karışıklığım, henüz common.targets, csharp.targets, söz konusu csproj dosyasının sırasını anlamadığımdan kaynaklanıyor sanırım. 2. ProjectName'i önceden oluşturulmuş makro sayfasından aldım. Projenin özellik sayfaları - MSBuildProjectName'in ekip oluşturma için mevcut olup olmadığını araştırmam gerek. MSBuildProjectName nereden geliyor? Nasıl sağlandığına dair bir fikrin var mı? – bwerks

+1

3. Görünüşe göre malign ve etkisiz IsDesktopBuild $ (BuildingInsideVisualStudio) ile değiştirildi, ancak yalnızca bu özelliği yapı kütüğümde görmüş sayıyorum.TeamBuildOutDir'e gelince, haklısınız - normal bir VS yapısında ayarlanmadı, bu yüzden gerçekten varlığına bağlı olarak gerçekten tepki veriyorsunuz. Aslında bu fikri http://blogs.msdn.com/aaronhallberg/archive/2007/06/07/preserving-output-directory-structures-in-orcas-team-build.aspx adresinden aldım. – bwerks

+3

+1: Tüm öğleden sonranı henüz başlamamış $ $ (ProjectName) üzerinden başımı eğerek geçirdim. Bu bana ilk önce Stack Overflow'u kontrol etmememi öğretecek ... –