2011-04-07 15 views
22

En iyi duruma getirilmiş içeriği veya bir bayrağı temel alarak standart içeriği sağlayabilen bir T4 şablonum var. Şu anda bayrağımı elimle değiştiriyorum.Bir T4 şablonu çalıştırırken çözüm yapılandırmasını (hata ayıklama/bırakma) belirleme

Yapmaktan hoşlandığım şey, bayrağı Visual Studio'daki Çözümün Yapılandırması'nı temel alarak ayarlamaktır. Hata Ayıklama modunda oluşturulacaksa, standart içerik çıktılar. Yayınlama modunda oluşturulacaksa, içeriği optimize ederdim. T4 Text Template - Is it possible to get compilation symbols from host?

Ancak, benim durumumda aşağıdaki gibi bir şey yapmak ister ki: Ben umut verici görünüyor başka T4 soru bulundu

<#@ template language="C#" hostspecific="True" 
    compilerOptions="/d:$(ConfigurationName)" #> 

Ben bir montaj yönergede $ (SolutionDir) kullanabilir beri:

<#@ assembly name="$(SolutionDir)\myreference.dll" #> 

düşünürdüm/d: gitmem gereken yere $ (ConfigurationName'ini) beni alacağı ve benim bayrağını ayarlamak için aşağıdaki sonra yapabileceği:

<# 
#if Debug 
optimize = false; 
#else 
optimize = true; 
#endif 
#> 

Ne yazık ki, bu işe yaramıyor. Ayrıca, aşağıdakileri kullanmayı denedim:

Ayrıca boşuna. Herhangi bir fikir?

cevap

22

Daha önce sormam ama this MSDN article'un alt kısmında, olması gereken yere götüren bir parçacığı buluyorum. Buradaki cevap, Visual Studio DTE'u almak için IServiceProvider arayüzünü kullanmaktır.

var serviceProvider = Host as IServiceProvider; 
var dte = serviceProvider.GetService(typeof(DTE)) as DTE; 
var configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name ; 
optimize = (configName != "Debug"); 

GÜNCELLEME Bu kod aktif projenin şu anki yapılandırma döndü optimizasyonları olup olmadığını görmek için kontrol eder

: Burada yapıldığını oluyor kodu (sabit kodlanmış "Debug" için şimdiden özür) var üzerinde. Hala kodlanmış bir özellik adı var, ancak değişmesi daha az muhtemel. Ayrıca, projenin optimizasyon bayrağını kullanarak senaryo için mantıklı bir çok yapar (Ben kendi kodunda optimizasyonlar açmalısınız karar vermeye çalışıyordu): insanlar için

var serviceProvider = Host as IServiceProvider; 
var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as DTE; 
config = dte.Solution 
      .FindProjectItem(Host.TemplateFile) 
      .ContainingProject 
      .ConfigurationManager 
      .ActiveConfiguration; 
foreach(Property prop in config.Properties){ 
    if (prop.Name == "Optimize"){ 
     optimize = (bool)prop.Value; 
     break; 
    } 
} 
+0

MSDN belgelerinde DTE sınıfı için bir sayfa var mı? Onu arıyordum ve birini bulmakta zorlanıyorum. – rstackhouse

+0

Nevermind. Sanırım bunu yeni buldum: http://msdn.microsoft.com/en-us/library/vstudio/EnvDTE(v=vs.100).aspx – rstackhouse

+0

SDTE? Bu bir yazım hatası mı? –

9

(tasarım zamanında bu işi almaya çalışırken Dosya kaydetme) yanı sıra at build-time (F5/F6), iki yöntem gereklidir.

Emil, tasarım zamanı yöntemini açıklar. birikmesi defa, öncelikle proje dosyasında bir T4 parametresinin girilmesi yeterlidir: aramaya ardından

<#@ parameter type="System.String" name="BuildConfiguration" #> 

Ve:

<ItemGroup> 
    <T4ParameterValues Include="BuildConfiguration"> 
    <Value>$(Configuration)</Value> 
    <Visible>false</Visible>  
    </T4ParameterValues> 
</ItemGroup> 

Sonra .tt üst kısmında başvurmak zorunda bunlardan hangisi sağlanacak olur: sizin şablon her iki senaryoda da çalışmak istiyorsanız her ikisi için de mantık dahil etmek gereklidir

string configurationName = Host.ResolveParameterValue("-", "-", "BuildConfiguration"); 
if (string.IsNullOrWhiteSpace(configurationName)) 
{ 
    var serviceProvider = (IServiceProvider)Host; 
    var dte = (DTE)serviceProvider.GetService(typeof(DTE)); 
    configurationName = dte.Solution.SolutionBuild.ActiveConfiguration.Name; 
} 

. Tasarım zamanı yöntemi, oluşturma zamanında çalışmaz (Çözüm sağlamak için DTE Ana Bilgisayarı etrafında değildir) ve yapı zamanı yöntemi, tasarım zamanında çalışmaz (MSBuild, parametreyi sağlamak üzere değildir).

İlgili konular