2010-08-23 7 views
13

मेरे पास एक समाधान है जिसमें इसमें कुछ परियोजनाएं हैं। मैं किसी अन्य प्रोजेक्ट में कोड के आधार पर परीक्षण उत्पन्न करने के लिए अपनी परीक्षण परियोजनाओं में से एक में कुछ टी 4 टेम्पलेट्स बनाना चाहता हूं। परीक्षण परियोजना में अन्य परियोजना के लिए एक परियोजना संदर्भ है। मेरी समस्या यह है कि मुझे नहीं पता कि edmx फ़ाइल में फ़ाइल पथ कैसे प्राप्त करें, मुझे कोड जेनरेट करने की आवश्यकता है।टी 4 टेम्पलेट में संदर्भित परियोजना के पथ प्राप्त करें?

उदाहरण (नाटक इस एक ASCII आधारित समाधान एक्सप्लोरर है):

MySolution.sln 
-> MyTests.csproj (C:\a\b\c\) 
----> GeneratedTests.tt (C:\a\b\c\GeneratedTests.tt) 
-> MyDAL.csproj (C:\x\y\z\) 
----> MyModel.edmx (C:\x\y\z\MyModel.edmx) 

कैसे मेरी GeneratedTests.tt MyModel.edmx यह करने के लिए अपनी परियोजना संदर्भ के उपयोग के लिए एक फ़ाइल पथ प्राप्त करने में सक्षम हो सकता है?

उत्तर

4

यह इस तरह से काम नहीं करता है। आपको पथ द्वारा डीएलएल का संदर्भ देना होगा (आप इसे Host.ResolvePath के साथ पा सकते हैं और टूलबॉक्स से VolatileAssembly टैग का उपयोग करके वीएस को पुनरारंभ किए बिना इसे पुन: संकलित करने में सक्षम हो सकते हैं) और मॉडल पर काम करने के लिए प्रतिबिंब का उपयोग करें।

+0

पथ द्वारा डीएलएल का संदर्भ देने से समस्या का सामना करना पड़ रहा है। एक देव बॉक्स में परियोजना एक ही स्थान पर हो सकती है जबकि दूसरे व्यक्ति के पास यह दूसरी जगह है। अगर मैं स्थान ग्रहण कर सकता हूं, तो मुझे टेम्पलेट को निर्धारित करने की आवश्यकता नहीं होगी - मैं बस इसे हार्डकोड कर सकता हूं या बिल्ड स्क्रिप्ट के साथ इंजेक्ट कर सकता हूं। मॉडल पर काम करना कोई समस्या नहीं है - अगर मैं पथ को हार्डकोड करता हूं तो मेरी स्क्रिप्ट पूरी तरह से चलती है। मुझे बस उस पथ को गतिशील रूप से निर्धारित करने के लिए एक तरीका चाहिए। Host.Resolve का उपयोग करना ठीक है अगर मुझे टेम्पलेट के पथ की आवश्यकता है - मुझे केवल माईडल असेंबली के स्रोत के लिए पथ को समझने की आवश्यकता है। – Jaxidian

+2

होस्ट। रेसोल्वपाथ ("।") काम करता है। :) – Jaxidian

1

आप टेम्पलेट से $(ProjectDir), $(SolutionDir) जैसे विशेष निर्देशिकाओं के लिए मैक्रोज़ का उपयोग कर सकते हैं, और शायद अन्य प्रोजेक्ट के लिए निर्देशिका निकालने के लिए .sln या .csproj फ़ाइल को पढ़ सकते हैं।

+0

मैं .sln फ़ाइल पढ़ने से बचने की उम्मीद कर रहा था - मुझे लगता है कि ज्यादातर मुझे यह अच्छी तरह से समझ में नहीं आता है और मुझे यकीन नहीं है कि मैं क्या कर सकता हूं कि पथ में कितना भरोसेमंद है। क्या आप मुझे बेहतर समझने के लिए कोई लिंक दे सकते हैं, शायद? – Jaxidian

+0

असल में, मुझे नहीं लगता कि यह उपयुक्त है। वे मैक्रोज़ केवल टी 4 निर्देशों जैसे '<# @ असेंबली #>' और '<#@include #>' –

+6

में काम करने लगते हैं यदि आपको टी 4 निर्देश के बाहर एक मैक्रो पथ को हल करने की आवश्यकता है तो आप इसे उपयोग करके कर सकते हैं: 'strPath = Host.ResolveAssemblyReference ("$ (ProjectDir)") ', ResolvePath मैक्रोज़ के साथ काम नहीं करता है - शायद भविष्य में वृद्धि? –

15

यह उत्तर केवल विजुअल स्टूडियो के भीतर से काम करता है।

टी 4 टेम्पलेट की "होस्टस्पेसिफिक" संपत्ति सेट करें। यह आपको होस्ट संपत्ति तक पहुंच प्रदान करता है। GetService (टाइपऑफ (डीटीई) को कॉल करने के लिए IServiceProvider पर कास्ट होस्ट टाइप करें। यह आपको समाधान की सामग्री को पार करने देता है।

<#@ template language="c#" hostspecific="true" #> 
<#@ assembly name="EnvDTE" #> 
<#@ import namespace="EnvDTE" #> 
These are the projects in this solution: 
<# 
var serviceProvider = this.Host as IServiceProvider; 
var dte = serviceProvider.GetService(typeof(DTE)) as DTE; 
foreach (Project p in dte.Solution.Projects) 
{ 
#> 
    <#=p.Name#> at <#=p.FullName#> 
<# 
} 
#> 

इसके अलावा ITextTemplatingEngineHost interface on MSDN और T4 Architecture by Oleg Synch का उदाहरण देखें।

+0

मुझे लगता है कि यह मेरे लिए अच्छी तरह से काम करेगा अगर यह काम करता है जैसा लगता है। क्या आप अपनी टिप्पणी पर विस्तार से बता सकते हैं कि यह केवल विजुअल स्टूडियो के भीतर काम करता है? हमारे पास हमारी टेम्पलेट पीढ़ियों को स्वचालित करने की योजना है क्योंकि हम उन्हें अपने समाधान पर डालना शुरू कर रहे हैं क्योंकि यह मैन्युअल रूप से जाने और सबकुछ उत्पन्न करने के लिए दर्दनाक बनना शुरू हो गया है। हम बिल्कुल नहीं जानते कि हम इसे कैसे स्वचालित करेंगे, इसलिए आपका उत्तर हमें इसकी योजना बनाने में मदद कर सकता है। नंत, पीएस/एमएसबिल्ड, जो भी हो - हम इसे ठीक कर रहे हैं हालांकि इसे करना जरूरी है। – Jaxidian

+0

जब आप hostpecific = "true" सेट करते हैं, तो टेम्पलेट को होस्ट पैरामीटर तक पहुंच प्राप्त होती है। लेकिन नीचे की ओर यह है कि टी 4 होस्ट को इसे प्रदान करना होगा। इस मामले में, टी 4 होस्ट को विजुअल स्टूडियो माना जाता है, जो डीटीई इंटरफ़ेस को लागू करता है। कमांड लाइन बिल्ड शून्य वापस आ जाएगा। यदि आप इस विधि का उपयोग करना चाहते हैं, तो मेरा सुझाव है कि आप अपने टेम्पलेट को विजुअल स्टूडियो के भीतर बदल दें, न कि निर्माण के भीतर। स्वचालित निर्माण जेनरेट कोड का उपयोग कर सकते हैं। –

4

उपयोग इन पंक्तियों

string path = this.Host.ResolvePath(""); 
Directory.SetCurrentDirectory(path); 

तो सापेक्ष पथ का उपयोग अपने edmx फ़ाइल उदा, स्ट्रिंग inputfile = @ ".. \ Modal.edmx" प्राप्त करने के लिए;

10

जेम्स बंद की टिप्पणी के आधार पर, मैं अपने फ़ाइल पथ डीबगिंग के लिए निम्न टेम्पलेट लिखने में सक्षम था:

<#@ template language="C#" debug="true" hostspecific="true"#> 
<#@ include file="EF.Utility.CS.ttinclude"#><#@ 
output extension=".txt"#><# 

/////////Some standard-ish settings, continue reading on 
CodeGenerationTools code = new CodeGenerationTools(this); 
MetadataLoader loader = new MetadataLoader(this); 
CodeRegion region = new CodeRegion(this, 1); 
MetadataTools ef = new MetadataTools(this); 

/////////Below are the relevant sections I used for debugging 

    string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//Gives you the location of MySolution.sln 
    string edmxFile = solutionsPath + "MyDAL/MyDAL/MyModel.edmx"; //Note - VS projects usually have a subdir with the same name as the sln, hence the repetition for MyDAL 
#> 
Does this file exist? 

<# 
// 
if (File.Exists(edmxFile)) 
{ 
    //Continue. 
    #> 
    Yes 
    <# 
} 
else 
{ 
    #> 
    No 
    <# 
} 
#> 

यह एक .txt फ़ाइल उत्पन्न होगा और बहुत जल्दी की मदद से आप डिबग कि क्या आपके पथ सकता है स्थित हो या नहीं।

एक साइड नोट के रूप में, जहां एक रिश्तेदार डायर पथ (उदाहरण के लिए ../App.config) था, जहां पाया जा सकता था, मैंने पाया कि यह प्रत्येक निर्देशिका स्तर पर फ़ाइल (जैसे test1.txt) डालने में मदद करता है, जैसा कि मैंने सोचा था बाहर Host.ResolvePath मेरे सेटअप के साथ वर्तमान असेंबली के बाहर देखने में सक्षम नहीं था। यह चेतावनी बहुत तेज़ी से भ्रमित हो सकती है क्योंकि ../../App.configMySolution\App.config को हल कर सकता है, लेकिन ../../MyDal/README.txt हल नहीं होगा (इसलिए फ़ाइल नहीं मिलेगी), भले ही यह सही पथ हो। उपर्युक्त कोड इस समस्या को तब तक अस्वीकार कर रहा है जब तक मैं देख सकता हूं। How to use the poco entity generator

0

मीना और दूसरों के जवाब मैं इस समाधान के साथ आया था के आधार पर -

ऊपर समाधान भी इस मुद्दे के लिए एक प्रस्ताव हो सकता है। यह वर्तमान कार्यशील निर्देशिका, समाधान पथ सूचीबद्ध करता है और सक्रिय कार्यशील निर्देशिका को बदलने के लिए मीना की चाल का उपयोग करता है।

<#@ template debug="true" hostspecific="true" language="C#" #> 
<#@ output extension=".cs" #> 
<#@ import namespace="System.IO" #> 
<#@ assembly name="EnvDTE" #> 
<#@ import namespace="EnvDTE" #> 
<# 
string cwd1 = System.IO.Directory.GetCurrentDirectory(); 
string solutionPath = Host.ResolveAssemblyReference("$(SolutionDir)"); 
Directory.SetCurrentDirectory(solutionPath); 
string cwd2 = System.IO.Directory.GetCurrentDirectory(); 
#> 
// Solutionpath is:<#= solutionPath #>, old cwd: <#= cwd1 #>, new cwd: <#= cwd2 #>