2011-04-07 17 views
22

चलाते समय समाधान कॉन्फ़िगरेशन (डीबग/रिलीज़) निर्धारित करें मेरे पास एक टी 4 टेम्पलेट है जो ध्वज के आधार पर या तो अनुकूलित सामग्री या मानक सामग्री आउटपुट कर सकता है। वर्तमान में मैं अपनी आवश्यकताओं के आधार पर ध्वज मैन्युअल रूप से बदल रहा हूं।टी 4 टेम्पलेट

मुझे जो करना है वह दृश्य स्टूडियो में समाधान के कॉन्फ़िगरेशन के आधार पर ध्वज सेट करना है। यदि डीबग मोड में निर्माण करने के लिए सेट किया गया है, तो मैं मानक सामग्री आउटपुट करता हूं। अगर रिलीज मोड में निर्माण करने के लिए सेट किया गया है, तो मैं इसके बजाय सामग्री को अनुकूलित कर दूंगा। T4 Text Template - Is it possible to get compilation symbols from host?

हालांकि, मेरे मामले में मैं निम्नलिखित की तरह कुछ करना चाहता हूँ होगा:: मैं एक और टी -4 सवाल है कि होनहार लग रहा है पाया

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

जब से मैं एक विधानसभा निर्देश में $ (SolutionDir) का उपयोग कर सकते हैं:

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

मुझे लगता है कि होगा/डी: $ (ConfigurationName) मेरे जहां मैं जाना चाहते हैं उसे प्राप्त होगा, और फिर मैं अपने ध्वज सेट करने के लिए निम्न कर सकता है:

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

हां, यह काम नहीं प्रतीत होता है। मैंने इसका उपयोग करने का भी प्रयास किया है:

Host.ResolveParameterValue("-", "-", "ConfigurationName"); 

इसके अलावा कोई फायदा नहीं हुआ। कोई विचार?

उत्तर

22

मैं जल्द से जल्द पूछता हूं लेकिन मुझे this MSDN article के नीचे एक स्निपेट मिलता है जो मुझे प्राप्त करने की आवश्यकता है। यहां जवाब Visual Studio DTE प्राप्त करने के लिए IServiceProvider इंटरफ़ेस का उपयोग करना है।

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

अद्यतन

इस कोड को अगर सक्रिय प्रोजेक्ट के मौजूदा विन्यास बदल गया अनुकूलन को देखने के लिए जाँच करेगा: यहाँ है कि है यह किया हो रही कोड (हार्ड-कोडेड "डीबग" के लिए पहले से क्षमा याचना) है पर। इसमें अभी भी एक हार्ड-कोडित संपत्ति का नाम है, लेकिन एक ऐसा है जो बदलने की संभावना कम है। इसके अलावा, इस परियोजना का अनुकूलन ध्वज का उपयोग कर मेरी परिदृश्य के लिए भावना का एक बहुत बनाता है (अगर मैं अपने खुद के कोड में अनुकूलन चालू करना चाहिए तय करने की कोशिश):

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

क्या एमएसडीएन दस्तावेज़ों में डीटीई कक्षा के लिए कोई पृष्ठ है? मैं इसके लिए खोज कर रहा हूं और मुझे ढूंढने में कठिनाई हो रही है। – rstackhouse

+0

कभी नहीं। मुझे लगता है कि मैंने इसे अभी पाया: http://msdn.microsoft.com/en-us/library/vstudio/EnvDTE(v=vs.100).aspx – rstackhouse

+0

एसडीटीई? क्या यह एक टाइपो है? –

9

लोगों के लिए डिजाइन-समय पर इस काम पाने के लिए (कोशिश कर फाइल सेव) साथ ही at build-time (एफ 5/एफ 6), दो विधियां आवश्यक हैं।

एमिल डिजाइन-टाइम विधि का वर्णन करता है। निर्माण समय के लिए, आप पहली बार अपने प्रोजेक्ट फाइल में एक टी -4 पैरामीटर निर्दिष्ट करने के लिए है:

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

और फिर देखने के लिए:

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

तो फिर आप अपने .tt के शीर्ष पर इसे संदर्भ के लिए है उनमें से जो भी प्रदान किया जाना होता है:

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; 
} 

यह दोनों अगर आप अपने टेम्पलेट दोनों स्थितियों में काम करना चाहते हैं के लिए तर्क शामिल करने के लिए आवश्यक है। डिज़ाइन-टाइम विधि बिल्ड-टाइम पर काम नहीं करती है (डीटीई होस्ट समाधान प्रदान करने के लिए आसपास नहीं है), और बिल्ड-टाइम विधि डिज़ाइन-टाइम पर काम नहीं करती है (एमएसबिल्ड पैरामीटर प्रदान करने के लिए आसपास नहीं है)।

संबंधित मुद्दे