2010-10-27 13 views
10

जब मैं टी 4 संपादित करता हूं, तब भी जब भी मैं दूसरी फ़ाइल में स्विच करता हूं तो स्क्रिप्ट निष्पादित की जाती है। यह त्वरित सरल स्क्रिप्ट के लिए ठीक है, लेकिन कुछ स्क्रिप्ट को निष्पादित करने में लंबा समय लगता है। क्या इस व्यवहार को अक्षम करने का कोई तरीका है? मैं चाहता हूं कि स्क्रिप्ट केवल तभी चलें जब मैं टी 4 फ़ाइल को सहेजता हूं या मैन्युअल रूप से मेनू से "कस्टम टूल चलाएं" चुनता हूं।हर बार जब मैं किसी अन्य टैब पर स्विच करता हूं तो टी 4 को निष्पादित करने से कैसे रोकें?

उत्तर

5

टी 4 सी #/वीबी प्रोजेक्ट सिस्टम में कस्टम टूल मैकेनिज्म (IVsSingleFileGenerator) से जुड़ा हुआ है, जो इसे सहेजने, कस्टम टूल मेनू चलाने और टैब स्विचिंग व्यवहार पर चलाने के लिए चलाता है - सभी कार्यान्वयन की कीमत के लिए एक साधारण इंटरफेस।

दुर्भाग्य से इसका मतलब है कि टी 4 के उन व्यवहारों पर अनिवार्य रूप से कोई नियंत्रण नहीं है, जो कस्टम उपकरण के लिए मानक हैं।

निर्माण विकल्प पर टी 4 करने के लिए वी 4 मॉडलिंग और विजुअलाइजेशन एसडीके में टी 4 एमएसबिल्ड समर्थन का उपयोग करने के लिए एक विकल्प हो सकता है और फिर कस्टम टूल को अक्षम कर सकता है। मैं अपने सहयोगी से पूछताछ करता हूं जिसने msbuild समर्थन बनाया है यदि यह टेम्पलेट के सेट की पहचान करने के लिए कस्टम उपकरण का उपयोग करता है या नहीं और थ्रेड पर वापस पोस्ट करता है।

+0

मैं टी 4 टूलबॉक्स का उपयोग करता हूं जो एकाधिक फाइलें उत्पन्न करता है और इस प्रकार समाधान को संशोधित करता है। मुझे यकीन नहीं है कि यह एमएसबिल्ड में काम करेगा। बिल्डिंग समय पर केवल टी 4 चलाना मेरे लिए एक विकल्प नहीं है, जब भी मैं टी 4 फाइल को सहेजता हूं, मैं परिणामों को अपरिहार्य रूप से देखना चाहता हूं। लेकिन उन लोगों के लिए एमएसबिल्ड का उपयोग करने के बारे में जानकारी प्रदान करने के लिए आपका स्वागत है जो इस प्रश्न को पाते हैं। यह उनके लिए उपयोगी हो सकता है। – Athari

+1

मुझे लगता है - हमने दोनों को एकीकृत करने की कोशिश नहीं की है - ओलेग अच्छी तरह से कर सकता है। मैंने बस पुष्टि की है कि कस्टम उपकरण अब msbuild के लिए आवश्यक नहीं है, लेकिन इसके बजाय आपको आइटम प्रकार को अपनी csproj/vbproj फ़ाइल में किसी भी/compile से T4Transform या T4Preprocess में बदलने की आवश्यकता होगी। आउटपुट फाइलें अब आपके प्रोजेक्ट का हिस्सा नहीं रहेंगी। मेटाडेटा है जो उन्हें इंटरमीडिएट ओबीजे फ़ोल्डर या कहीं भी समान रीडायरेक्ट कर सकता है। – GarethJ

-1

फ़ाइल सहेजी जाने पर टी 4 टेम्पलेट निष्पादित किए जाते हैं। यदि आपके पास फ़ाइल से दूर टैब होने पर ऑटो-सेव करने के लिए वीएस सेटअप है जो व्यवहार की व्याख्या कर सकता है। यह निर्धारित करने के लिए कि क्या आप टैब दूर करते हैं, वीएस फ़ाइल को सहेज रहा है या नहीं, यह निर्धारित करने के लिए अपने वीएस कॉन्फ़िगरेशन की समीक्षा करें।

+4

सवाल यह है कि यह सेटिंग कहां है? – Athari

+3

-1 यह गलत जानकारी है। जब आप टैब स्विच करते हैं, तो T4 टेम्पलेट स्वचालित रूप से निष्पादित होता है, भले ही टैब में अभी भी "*" नाम है, यह दर्शाता है कि फ़ाइल सहेजी नहीं गई है। – mellamokb

8

मेरे पास एक ही समस्या थी। मैंने टेम्पलेट को किसी अन्य प्रोजेक्ट में विभाजित करने और आउटपुट फ़ाइलों को साझा करने के बारे में इस आलेख http://msdn.microsoft.com/en-us/library/ee789839.aspx में दिए गए चरणों का पालन किया।

यह विवरण कैसे बंद करने की TextTemplatingFileGenerator सही टेम्पलेट क्लिक करके और CustomTool संपत्ति को साफ़ करके टेम्पलेट से जुड़ी उपकरण। यह सहेजे जाने पर टेम्पलेट जनरेटिंग कोड रोकता है ... लेकिन टैब स्विच करते समय यह अभी भी चलता है!

मुझे लगता है कि यह गोल करने का एकमात्र तरीका आपके सभी टेम्पलेट कोड को एक अलग फ़ाइल में एक अलग प्रत्यय (जैसे ttinclude या t4 या कुछ) के साथ स्थानांतरित करना होगा और फिर इस फ़ाइल को अपनी वास्तविक T4 टेम्पलेट फ़ाइल में शामिल करना होगा निर्देश शामिल करें। इस तरह आपको टेम्पलेट को संपादित करने के लिए उस फ़ाइल को कभी भी खोलने की आवश्यकता नहीं होगी, इसलिए यह दुर्घटना से नहीं चलेगा।

तो एक फ़ाइल में MyTemplate.tt कहा जाता है:

<#@ template language="VB" debug="false" hostspecific="true"#> 
<#@ include file="Include\MyTemplateCodeBehind.t4" #> 
<#@ output extension=".vb"#> 
<# ' Nothing to see here! #> 

MyTemplateCodeBehind.t4 बुलाया अन्य फ़ाइल में जबकि:

<#@ template language="VB" debug="false" hostspecific="true"#> 
<# 
    For Each something In somecollection 
#> 
    <#= something.PrintMyCode() #> 
<# 
    Next 

#> 
1

संकलन निर्देशों के बाद सही प्रयास करें, विधि से बाहर निकलने के लिए एक वापसी जोड़ने

<#@ template language="C#" debug="false" hostspecific="true"#> 
<#@ include file="EF6.Utility.CS.ttinclude"#><#@ 
output extension="Repository.cs"#><# 
return string.Empty;  //<-- add this line!!! 

...

2

मैं क्या कर रहा हूँ (शायद एक बुरा विधि) टीटी फ़ाइल एक अपवाद लाइन की तरह की शुरुआत में लिख रहा है:

<# throw new Exception(); #> 

क्योंकि मैं एक अपवाद प्रक्रिया रोक फेंक और जब मैं सब काम मैं खत्म बस इस लाइन को हटाना है। :)

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

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