हर बिल्ड पर T4 टेम्पलेट चलाने के लिए Visual Studio प्राप्त करें


163

हर बिल्ड पर इसका आउटपुट जेनरेट करने के लिए मुझे T4 टेम्प्लेट कैसे मिलेगा? जैसा कि यह अब है, यह केवल तब पुन: उत्पन्न होता है जब मैं टेम्पलेट में बदलाव करता हूं।

मुझे इसके समान अन्य प्रश्न मिले हैं:

दृश्य स्टूडियो (अनुत्तरित) में T4 परिवर्तन और निर्माण क्रम

दृश्य स्टूडियो में निर्माण करने के लिए t4 फाइलें कैसे प्राप्त करें? (उत्तर पर्याप्त विस्तृत नहीं हैं [जबकि अभी भी बहुत जटिल है] और कुल अर्थ भी नहीं है)

ऐसा करने का एक सरल तरीका मिल गया है!


जबकि मुझे व्यक्तिगत रूप से इस बात का उत्तर सुनने में काफी दिलचस्पी होगी कि आपका विशेष परिदृश्य क्या है? आम तौर पर टेम्पलेट का आउटपुट केवल इनपुट का एक फ़ंक्शन होना चाहिए, इसलिए परिवर्तन पर उत्पन्न ठीक है।
पावेल मिनाएव

6
मेरा टेम्पलेट अन्य विधानसभाओं की जांच करने के लिए प्रतिबिंब का उपयोग करता है, जो कि पिछले निर्माण के बाद बदल गया हो सकता है।
जोएलफैन

इस विचार के बारे में क्या: stackoverflow.com/questions/1649649/…
JoelFan

मेरा टेम्प्लेट एक उद्देश्य प्रदान करता है, बिल्ड दिनांक समय रिकॉर्ड करें।
स्कॉट सोल्मर

जवाबों:


68

मैंने w / इस आने के लिए जोएलफैन के उत्तर का उपयोग किया। मुझे यह बेहतर पसंद है क्योंकि आपको हर बार जब आप प्रोजेक्ट में एक नई .tt फ़ाइल जोड़ते हैं तो प्री-बिल्ड ईवेंट को संशोधित करना याद नहीं रहता।

  • अपने लिए TextTransform.exe जोड़ें %PATH%
  • एक बैच फ़ाइल बनाई, जिसका नाम है transform_all.bat (नीचे देखें)
  • एक पूर्व-निर्माण घटना बनाएँ " transform_all ..\.."

transform_all.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: set the working dir (default to current dir)
set wdir=%cd%
if not (%1)==() set wdir=%1

:: set the file extension (default to vb)
set extension=vb
if not (%2)==() set extension=%2

echo executing transform_all from %wdir%
:: create a list of all the T4 templates in the working dir
dir %wdir%\*.tt /b /s > t4list.txt

echo the following T4 templates will be transformed:
type t4list.txt

:: transform all the templates
for /f %%d in (t4list.txt) do (
set file_name=%%d
set file_name=!file_name:~0,-3!.%extension%
echo:  \--^> !file_name!    
TextTransform.exe -out !file_name! %%d
)

echo transformation complete

28
अच्छा समाधान। मैंने "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe"बैच फ़ाइल में TextTransform.exe ( ) के लिए पूर्ण पथ डालने को प्राथमिकता दी , बजाय इसे% PATH% में जोड़ने के
एडम Nofsinger

20
एक बेहतर चर% COMMONPROGRAMFILES (x86)% के बजाय% COMMONPROGRAMFILES% होगा क्योंकि यह 64 बिट सिस्टम पर भी काम करेगा।
डरडेन81

3
तो पूरा रास्ता होगा %COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe। इसे दोहरे कोट्स में लपेटें।
उत्तरबेन

1
@ piers7: मैंने स्क्रिप्ट चलाने वाले OS की 'बिटनेस' का स्वचालित रूप से पता लगाने के लिए कोड अपडेट किया। मैंने ओब्जेक्ट डायरेक्टरी को छोड़ने के लिए नॉर्थबेन की टिप्पणी को भी शामिल किया है और% PATH% पर्यावरण चर को संशोधित नहीं करने पर एडम नोफिंगर की प्राथमिकता को लागू किया है।
एलेक्स Essilfie

1
IMHO को चूसने का मार्ग प्रदान करना TextTransform.exeहै। आप विजुअल स्टूडियो में "रन कस्टम टूल" पर राइट-क्लिक कर सकते हैं, इसलिए इसमें पहले से ही टूल का रास्ता है। जब मैं विज़ुअल स्टूडियो संदर्भ से निर्माण कर रहा हूं तो मुझे इसे फिर से प्रदान करने के काम से क्यों गुजरना पड़ता है?
जेजे

70

मैं GarethJ से सहमत हूं - VS2010 में प्रत्येक बिल्ड पर tt टेम्प्लेट को पुनर्जीवित करना बहुत आसान है। ओलेग साइक के ब्लॉग का वर्णन है कि यह कैसे करना है। संक्षेप में:

  1. Visual Studio SDK स्थापित करें
  2. Visual Studio 2010 मॉडलिंग और विज़ुअलाइज़ेशन SDK स्थापित करें
  3. टेक्स्ट एडिटर प्रोजेक्ट फ़ाइल में खोलें और फ़ाइल के अंत में जोड़ें, लेकिन पहले </Project>

बस। अपना प्रोजेक्ट खोलें। प्रत्येक बिल्ड पर सभी * .tt टेम्प्लेट पुन: अंकित किए जाएंगे

<!-- This line could already present in file. If it is so just skip it  -->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- process *.tt templates on each build  -->
<PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />

2
यहाँ ओलेग साइक
फिलचुआंग

4
यह बहुत अच्छा उपाय है। हालांकि एसडीके की स्थापना की आवश्यकता के बिना इसे प्राप्त करने का एक तरीका है? मैं इसे .targets फ़ाइलों और संबंधित असेंबली की प्रतिलिपि बनाकर काम करने की कोशिश कर रहा हूं, लेकिन सफलता के बिना।
ग्रिमस

3
चिरपी किसी भी एसडीके को डाउनलोड किए बिना काम करने के लिए प्रकट होता है ... हालांकि, आपको अभी भी चिरपी को डाउनलोड और कॉन्फ़िगर करना होगा। मैं अभी भी एक समाधान खोजने की कोशिश कर रहा हूं जो VS2010 की डिफ़ॉल्ट स्थापना पर काम करता है, और स्रोत रिपॉजिटरी के माध्यम से उपलब्ध होगा ताकि डेवलपर्स को केवल काम करने के लिए रेपो की जांच करने की आवश्यकता हो। इन सभी अन्य समाधानों के लिए बहुत अधिक प्रति-डेवलपर ध्यान देने की आवश्यकता है।
मीर

1
यदि आप MSBuild के x64 संस्करण का उपयोग करके अपनी परियोजनाएँ बनाते हैं - तो आपको यह त्रुटि मिलेगी: 'MSB4019: आयातित प्रोजेक्ट "C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating.targets। " नहीं मिला।' त्रुटि। समाधान - एक प्रोजेक्ट फ़ाइल में $ (MSBuildExtensionsPath32) द्वारा $ (MSBuildExtensionsPath) चर को बदलें।
रस्टेड

3
इसके अलावा, आपको .csproj फ़ाइलों को पैच करने की आवश्यकता नहीं है। कमांड लाइन से कुछ इस तरह से आह्वान करें msbuild mySolution.sln /p:CustomAfterMicrosoftCommonTargets="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" /p:TransformOnBuild=true /p:TransformOutOfDateOnly=false
Giulio Vian

29

एक महान NuGet पैकेज है जो सिर्फ यही करता है:

PM> Install-Package Clarius.TransformOnBuild

पैकेज के बारे में विवरण यहां पाया जा सकता है


2
एक 'अनौपचारिक' कांटा है: nuget.org/packages/Clarius.TransformOnBuild-unofficial जो contentबिल्ड एक्शन का समर्थन करता है
Erno

1
यह अच्छा विस्तार है लेकिन यह कमांडलाइन मोड में TextTransform.exe चला रहा है, इसलिए शत्रुतापूर्ण = "सही"
फ़ंक्शंस

1
@JishishRabadiya इस लाइन को टेम्प्लेट के शीर्ष पर जोड़ें:<#@ template language="C#" #>
पीटर वैन केकेम

2
ऐसा प्रतीत होता है कि पैकेज को hostspecific = "true" और अन्य मुद्दों का समर्थन करने के लिए अपडेट किया गया है (8 दिन पहले)
मिंगवेई सैमुअल

1
कंटेंट बिल्ड एक्शन अब नवीनतम संस्करण के साथ काम कर रहा है।
androbin

20

मैंने MarkGr के उत्तर का उपयोग किया और इस समाधान को विकसित किया। सबसे पहले, मुख्य समाधान फ़ोल्डर के ऊपर एक अलग उपकरण फ़ोल्डर में RunTemplate.bat नामक एक बैच फ़ाइल बनाएं । बैच फ़ाइल में केवल रेखा है:

"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out %1.cs -P %2 -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" %1.tt

यह बैच फ़ाइल 2 पैरामीटर लेती है ... % 1 .tt एक्सटेंशन के बिना .tt फ़ाइल का पथ है। % 2 टेम्पलेट में असेंबली निर्देशों द्वारा निर्दिष्ट किसी भी DLL का मार्ग है ।

इसके बाद, T4 टेम्पलेट वाले प्रोजेक्ट के प्रोजेक्ट गुण पर जाएं। बिल्ड ईवेंट में जाएं और निम्न प्री-बिल्ड ईवेंट कमांड लाइन जोड़ें :

$(SolutionDir)..\..\tools\RunTemplate.bat $(ProjectDir)MyTemplate $(OutDir)

जगह MyTemplate .tt विस्तार के बिना अपने .tt फ़ाइल (यानी MyTemplate.tt) की फ़ाइल नाम के साथ। इस परियोजना के निर्माण से पहले MyTemplate.cs का उत्पादन करने के लिए टेम्पलेट का विस्तार करने का परिणाम होगा। फिर वास्तविक बिल्ड MyTemplate.cs को संकलित करेगा


हालाँकि मुझे अभी भी समस्या है: stackoverflow.com/questions/1669893/…
जोएलफैन

1
$ (SolutionDir) के आसपास के उद्धरण मत भूलना .. \ .. \ tools \ RunTemplate.bat
इवाल्ड हॉफमैन

14

हाल ही में इस महान वी.एस. प्लगइन, चिरपी को मिला

न केवल यह आपके T4 को एक बिल्ड पर उत्पन्न करता है, बल्कि यह T4- आधारित दृष्टिकोण को जावास्क्रिप्ट, CSS के मिनिमाइज़ेशन की अनुमति देता है, और यहां तक ​​कि आप अपने CSS के लिए LESS सिंटैक्स का उपयोग करने की अनुमति देता है!


13

संभवतः सबसे सरल तरीका है AutoT4 नामक Visual Studio एक्सटेंशन स्थापित करना

यह ऑटोमैटिक रूप से बिल्ड पर सभी T4 टेम्प्लेट चलाता है।


माना! कॉन्फ़िगर करने योग्य, और वीएस 2015 के साथ काम करता है। यह एनवीडीटीई असेंबली (बिल्ड कॉन्फ़िगरेशन प्राप्त करने के लिए) के उपयोग का भी समर्थन करता है, जो सभी तरीके नहीं करते हैं। केवल नकारात्मक पक्ष यह है कि सभी टीम के सदस्यों को एक्सटेंशन स्थापित करना होगा।
गायरोमाइट

12

पूर्व-निर्माण को एक पंक्ति में घटाया जा सकता है:

forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c echo Transforming @path && \"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"

यह .ttपरियोजना की सभी फाइलों को बदल देता है और उन्हें निर्माण आउटपुट में सूचीबद्ध करता है।

यदि आप बिल्ड आउटपुट नहीं चाहते हैं तो आपको कुछ "दिलचस्प व्यवहार" के आसपास काम करना होगा :

forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c @\"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"

बेशक, आप इसे एक बैच फ़ाइल में खींच सकते हैं, जिसमें आप चाहें तो परियोजना निर्देशिका पथ को पास कर सकते हैं।

नायब पथ को कुछ ट्विकिंग की आवश्यकता हो सकती है। ऊपर का रास्ता है जहाँ वीएस 2008 ने इसे मेरी मशीन पर स्थापित किया है; लेकिन आपको पता चल सकता है कि दोनों के बीच संस्करण संख्या TextTemplatingऔर TextTransform.exeअलग है।


@SprintStar, अगर आपके पास वीएस 2012 है तो शायद इसे करने का एक बेहतर तरीका है। अन्य उत्तर बेहतर तरीकों के बारे में बात करते हैं जो पहले से ही वीएस 2010 के लिए मौजूद हैं।
पीटर टेलर

यह सबसे अच्छी विधि है, क्योंकि मुझे कुछ भी स्थापित नहीं करना है।
रयान गेट्स

1
देखा कि कोई 1.2 नहीं था, लेकिन एक 12.0 था, इसलिए इसे बदल दिया, लेकिन इस त्रुटि को मिला:System.Exception: T4MVC can only execute through the Visual Studio host
Colmde

1
बस 1.2 के बजाय 14.0 का उपयोग करने के लिए फ़ोल्डर पथ को अपडेट करना था और जाने के लिए अच्छा था।
पिस्तौल-पीट

यह मेरी राय में सबसे अच्छा समाधान था (बस ऊपर बताए गए अनुसार 14.0 बदल रहा है)
नेल्सन रोड्रिगेज

9

बाहर की जाँच करें C: \ Program Files (x86) \ Common Files \ Microsoft साझा \ TextTemplating वहाँ में एक कमांड लाइन परिवर्तन है। वैकल्पिक रूप से एक कस्टम होस्ट के साथ MSBuild कार्य लिखें और अपने आप को रूपांतरित करें।


1
ओह, हालांकि आप "devenv / Command TextTransformation.TransformAllTemplates / Command File.Exit MySolution.sln" जैसे सामान कर सकते हैं, यह 2010 में कभी-कभी बिल्ड सर्वरों को तोड़ने के लिए जाता है। आपका सबसे अच्छा शर्त एक कस्टम होस्ट के साथ MSBuild कार्य लिखना है।
मार्कग्रे

डेस्कटॉप बिल्ड के लिए, बस एक मैक्रो बनाएं जो एक ट्रांसफॉर्मलटेमप्लेट करता है, और फिर एक बिल्ड।
MarkGr

7

सेठ रेनो और जोएलफैन के उत्तरों पर विस्तार करते हुए , मैं इसके साथ आया। इस समाधान के साथ परियोजना में एक नई .tt फ़ाइल जोड़ने पर हर बार प्री-बिल्ड ईवेंट को संशोधित करने के लिए याद रखने की आवश्यकता नहीं है।

कार्यान्वयन प्रक्रिया

  • एक बैच फ़ाइल बनाएं जिसका नाम transform_all.bat (नीचे देखें)
  • transform_all.bat "$(ProjectDir)" $(ProjectExt)आप जो निर्माण करना चाहते हैं, उसके साथ प्रत्येक प्रोजेक्ट के लिए प्री-बिल्ड इवेंट बनाएं

transform_all.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: set the correct path to the the app
if not defined ProgramFiles(x86). (
  echo 32-bit OS detected
  set ttPath=%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\
) else (
  echo 64-bit OS detected
  set ttPath=%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\
)

:: set the working dir (default to current dir)
if not (%1)==() pushd %~dp1

:: set the file extension (default to vb)
set ext=%2
if /i %ext:~1%==vbproj (
  set ext=vb
) else if /i %ext:~1%==csproj (
  set ext=cs
) else if /i [%ext%]==[] (
  set ext=vb
)

:: create a list of all the T4 templates in the working dir
echo Running TextTransform from %cd%
dir *.tt /b /s | findstr /vi obj > t4list.txt

:: transform all the templates
set blank=.
for /f "delims=" %%d in (t4list.txt) do (
  set file_name=%%d
  set file_name=!file_name:~0,-3!.%ext%
  echo:  \--^> !!file_name:%cd%=%blank%!
  "%ttPath%TextTransform.exe" -out "!file_name!" "%%d"
)

:: delete T4 list and return to previous directory
del t4list.txt
popd

echo T4 transformation complete


टिप्पणियाँ

  1. पाठ परिवर्तन मानता है कि T4 टेम्पलेट में कोड आपके प्रोजेक्ट प्रकार के समान भाषा है। यदि यह मामला आप पर लागू नहीं होता है, तो आपको $(ProjectExt)उन फाइलों के विस्तार के साथ तर्क को बदलना होगा जिन्हें आप कोड जनरेट करना चाहते हैं।

  2. .TTफाइलें परियोजना निर्देशिका में होनी चाहिए, अन्यथा वे निर्माण नहीं करेंगे। आप पहले तर्क के रूप में एक अलग पथ निर्दिष्ट करके टीटी फ़ाइलों का निर्माण कर सकते हैं ( यानी"$(ProjectDir)" टीटी फ़ाइलों वाले पथ से प्रतिस्थापित करें।)

  3. transform_all.batबैच फ़ाइल के लिए सही पथ सेट करने के लिए भी याद रखें ।
    उदाहरण के लिए, मैंने इसे अपनी समाधान निर्देशिका में रखा, इसलिए पूर्व-निर्माण घटना निम्नानुसार थी"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)


मैं इस दृष्टिकोण का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे एक त्रुटि मिल रही है, इस समय 'कॉमन अनपेक्षित था।' मेरे आउटपुट में। यह इस रेखा पर सही होता है: for / f "delims =" %% d in (t4list.txt) करते हैं ... कोई भी विचार जो मुझे याद आ रहा है?
माइकल लुईस

@MichaelLewis: मैं कई बार बिना किसी स्पॉटिंग के बैच फाइल से गुजरा हूं जो त्रुटि पैदा कर सकता है। सेठ रेनो द्वारा प्रस्तावित विधि को देखने की कोशिश करें कि क्या यह एक ही त्रुटि उत्पन्न करता है। इस बीच, क्या आप कृपया अपनी t4list.txtफ़ाइल PasteBin पर पोस्ट कर सकते हैं ताकि मैं यह देखने की कोशिश करूं कि क्या आपकी त्रुटि वहां से आ रही है?
एलेक्स Essilfie

मैंने उसी मुद्दे के साथ सेठ के दृष्टिकोण की कोशिश की ('इस समय' आम अप्रत्याशित था ')। मैं कॉर्पोरेट प्रतिबंधों के कारण t4list.txt फ़ाइल को पोस्ट नहीं कर सकता, लेकिन इसमें एक पंक्ति शामिल है, और \ Common पथ में प्रकट नहीं होता है।
माइकल लुईस

@MichaelLewis: दुर्भाग्य से, यदि आपकी त्रुटि होती है for /f "delims=" %%d in (t4list.txt) do (और कॉर्पोरेट प्रतिबंध आपको अपनी t4list.txtफ़ाइल पोस्ट करने से रोकते हैं , तो मुझे डर है कि मैं आपकी मदद करने के लिए बहुत कुछ नहीं कर सकता। मैं वास्तव में इसे हल करने में मदद करना चाहता था, लेकिन ऐसा लगता है कि यह असंभव होने जा रहा है क्योंकि मेरे पास आगे बढ़ने के लिए कोई डेटा नहीं है। समस्या को ठीक करने में अच्छी किस्मत और कृपया अपने समाधान को याद रखें जब आप सफल हों।
एलेक्स Essilfie

क्या यह संभव है जब tt सम्‍मिलित हो (this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;? Unfortunatelly, मुझे अशक्त संदर्भ अपवाद मिलता है , जब मैं दृश्य स्टूडियो के अंदर से tt चलाता हूं ।
एंड्री के।

6

यदि आप Visual Studio 2010 का उपयोग कर रहे हैं, तो आप Visual Studio मॉडलिंग और विज़ुअलाइज़ेशन SDK का उपयोग कर सकते हैं: http://code.msdn.microsoft.com/vsvmsdk

इसमें बिल्ड समय पर T4 टेम्पलेट को निष्पादित करने के लिए msbuild कार्य शामिल हैं।

अधिक विवरण के लिए ओलेग के ब्लॉग पर एक नज़र डालें: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration


4

अरे, मेरी स्क्रिप्ट आउटपुट एक्सटेंशन को पार्स भी कर सकती है

for /r %1 %%f in (*.tt) do (
 for /f "tokens=3,4 delims==, " %%a in (%%f) do (
  if %%~a==extension "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out %%~pnf.%%~b -P %%~pf -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" %%f
 )
)
echo Exit Code = %ERRORLEVEL%

बस transform_all.bat $(SolutionDir)प्री-बिल्ड इवेंट बनाएं , और आपके समाधान में सभी * .tt फाइलें स्वचालित रूप से रूपांतरित हो जाएंगी।


3

डायनमो.ऑटो टीटी वह करेगा जो आपको चाहिए। आप इसे regex के माध्यम से फ़ाइलों को देखने या बिल्ड पर जेनरेट करने के लिए कॉन्फ़िगर कर सकते हैं। यह आपको यह भी निर्दिष्ट करने की अनुमति देता है कि आप किस T4 टेम्पलेट को ट्रिगर करना चाहते हैं।

आप इसे यहाँ से डाउनलोड कर सकते हैं: https://github.com/MartinF/Dynamo.AutoTT

बस इसे बनाएँ, dll और AddIn फ़ाइलों की प्रतिलिपि बनाएँ

C: \ Users \ Documents \ Visual Studio 2012 \ Addins \

और दूर तुम जाओ।

यदि आप इसे VS2012 में ले जाना चाहते हैं, तो आपको डायनामो.ऑटो टीटी.एडइन फ़ाइल को संशोधित करना होगा और संस्करण को एडइन फ़ाइल के अंदर 11.0 पर सेट करना होगा;


3

GitHub.com/Mono/T4 के लिए धन्यवाद , फिलहाल आप इसे .NET कोर और विजुअल स्टूडियो दोनों के लिए कर सकते हैं, इसे आपकी .csprojफाइल में जोड़कर :

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-t4-project-tool" Version="2.0.5" />
    <TextTemplate Include="**\*.tt" />
  </ItemGroup>

  <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
    <ItemGroup>
      <Compile Remove="**\*.cs" />
    </ItemGroup>
    <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 %(TextTemplate.Identity)" />
    <ItemGroup>
      <Compile Include="**\*.cs" />
    </ItemGroup>
  </Target>

यदि आप अपने टेम्प्लेट को अलग-अलग प्रोग्रामिंग लैंग्वेज में बदलते हैं, तो आपको कुछ ऐसी चीज़ों को जोड़ना चाहिए <Compile Remove="**\*.vb" />और <Compile Include="**\*.vb" />इन फ़ाइलों को संकलित करने के लिए, भले ही आपके पास अभी तक फाइलें न हों।

Removeऔर Includeट्रिक केवल पहली बार पीढ़ी के लिए आवश्यक है, या आप XML को इस तरह छोटा कर सकते हैं:

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-t4-project-tool" Version="2.0.5" />
    <TextTemplate Include="**\*.tt" />
  </ItemGroup>

  <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
    <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 %(TextTemplate.Identity)" />
  </Target>

और सिर्फ दो बार (पहली बार) निर्माण करें। यदि आपने पहले से ही रिपॉजिटरी के लिए प्रतिबद्ध फ़ाइलों को उत्पन्न किया है, तो दोनों उदाहरणों के साथ पुनर्वित्त पर कोई समस्या नहीं होगी।

विजुअल स्टूडियो में आप कुछ इस तरह से देखना चाहते हैं:

यहां छवि विवरण दर्ज करें

इसके अलावा:

यहां छवि विवरण दर्ज करें

तो अपने प्रोजेक्ट फ़ाइल में कुछ इस तरह जोड़ें:

  <ItemGroup>
    <Compile Update="UInt16Class.cs">
      <DependentUpon>UInt16Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt32Class.cs">
      <DependentUpon>UInt32Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt64Class.cs">
      <DependentUpon>UInt64Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt8Class.cs">
      <DependentUpon>UInt8Class.tt</DependentUpon>
    </Compile>
  </ItemGroup>

यहां पूरा उदाहरण: GitHub.com/Konard/T4GenericsExample (एकल टेम्पलेट से कई फ़ाइलों की पीढ़ी शामिल है)।


1

यहाँ मेरा समाधान है - स्वीकृत उत्तर के समान। हमें अपने स्रोत नियंत्रण में समस्या थी। लक्ष्य .cs फ़ाइलें केवल-पढ़ने के लिए होती हैं और T4 विफल हो रहा था। यहाँ कोड है, जो अस्थायी फ़ोल्डर में T4 चलाता है, लक्ष्य फ़ाइलों की तुलना करता है, और इसे केवल उसी परिवर्तन के मामले में कॉपी करता है। यह read.only फ़ाइलों के साथ समस्या को ठीक नहीं करता है, लेकिन कम से कम यह बहुत बार नहीं होता है:

Transform.bat

ECHO Transforming T4 templates
SET CurrentDirBackup=%CD%
CD %1
ECHO %1
FOR /r %%f IN (*.tt) DO call :Transform %%f
CD %CurrentDirBackup%
ECHO T4 templates transformed
goto End

:Transform
set ttFile=%1
set csFile=%1

ECHO Transforming %ttFile%:
SET csFile=%ttFile:~0,-2%cs
For %%A in ("%ttFile%") do Set tempTT=%TEMP%\%%~nxA
For %%A in ("%csFile%") do Set tempCS=%TEMP%\%%~nxA

copy "%ttFile%" "%tempTT%
"%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe"  "%tempTT%"

fc %tempCS% %csFile% > nul
if errorlevel 1 (
 :: You can try to insert you check-out command here.
 "%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe"  "%ttFile%"
) ELSE (
 ECHO  no change in %csFile%
)

del %tempTT%
del %tempCS%
goto :eof

:End

आप अपने चेक-आउट कमांड को एक लाइन पर जोड़ने का प्रयास कर सकते हैं (:: आप कोशिश कर सकते हैं ....)

अपनी परियोजना में इसे एक प्रस्ताव कार्रवाई के रूप में सेट करें:

Path-To-Transform.bat "$(ProjectDir)"

1

आपको इस कमांड को प्रोजेक्ट के प्री-बिल्ड इवेंट में जोड़ना होगा:

if $(ConfigurationName) == Debug $(MSBuildToolsPath)\Msbuild.exe  /p:CustomBeforeMicrosoftCSharpTargets="$(ProgramFiles)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets"  $(ProjectPath) /t:TransformAll 

कॉन्फ़िगरेशन = डिबग पर चेक, यह सुनिश्चित करता है कि आप रिलीज़ मोड में कोड को पुन: उत्पन्न नहीं करते हैं, जब आप उदाहरण के लिए TFS बिल्ड सर्वर पर बिल्ड करते हैं।


अच्छा है लेकिन सभी को बदलना खतरनाक हो सकता है यदि T4MVC केवल प्रोजेक्ट में tt नहीं है और हम सभी को चलाना नहीं चाहते हैं ...
Landeeyo

3
मेरे पास v11.0 फ़ोल्डर में TextTemplating नहीं है। आपको वह कहाँ से मिलेगा?
ज़ैक

1

दृश्य स्टूडियो 2013 में, T4 टेम्पलेट पर राइट क्लिक करें और बिल्ड प्रॉपर्टी को ट्रू में सेट करें।


1
मैं राइट क्लिक मेनू पर इस विकल्प को खोजने में असमर्थ हूं, हालांकि एमएसडीएन के अनुसार वीएस 2012 और 2013 में प्रोजेक्ट फ़ाइल को संपादित करके ऐसा करना संभव है, देखें msdn.microsoft.com/en-us/library/ee847423। aspx या msdn.microsoft.com/en-us/library/vstudio/ee847423.aspx विवरण के लिए
yoel

यह एक विकल्प प्रतीत होता है जो केवल मूर्त T4 टूल के साथ आता है, विजुअल स्टूडियो में डिफ़ॉल्ट नहीं।
मैट डायट्रिओ

हाँ यह केवल T4 टूलबॉक्स के प्रो संस्करण में है।
पोम्पेयर

1

यहाँ है कि मैंने इसे कैसे निपटाया। लिंक करें । मूल रूप से एक महान ब्लॉग के शीर्ष पर इमारत (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ जो 2 अधिक पोस्ट नहीं कर सकता लिंक :() मैं इस .targets फ़ाइल के साथ दृश्य स्टूडियो proj फ़ाइलों के साथ उपयोग के लिए आया था ।

यह तब उपयोगी होता है जब आप अपने .tt के अंदर अन्य dll-s का उपयोग कर रहे होते हैं और आप चाहते हैं कि परिणाम बदल जाए क्योंकि dll-s बदल रहे हैं।

यह काम किस प्रकार करता है:

  1. Tt बनाएँ, असेंबली का नाम = "$ (SolutionDir) पथ \" to \ other \ project \ output \ foo.dll जोड़ें और अपेक्षित रूप से परिवर्तन और परिणाम सेट करें
  2. .Tt से विधानसभा संदर्भ निकालें

  3. Proj फ़ाइल के अंदर बिल्ड पर परिवर्तन सेट करने के लिए इस कोड का उपयोग करें:

    <PropertyGroup>
      <!-- Initial default value -->
      <_TransformExe>$(CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe</_TransformExe>
      <!-- If explicit VS version, override default -->
      <_TransformExe Condition="'$(VisualStudioVersion)' != ''">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe</_TransformExe>
      <!-- Cascading probing if file not found -->
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\11.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\12.0\TextTransform.exe</_TransformExe>
      <!-- Future proof 'til VS2013+2 -->
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\13.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\14.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\15.0\TextTransform.exe</_TransformExe>
    
      <IncludeForTransform>@(DllsToInclude, '&amp;quot; -r &amp;quot;')</IncludeForTransform>
    </PropertyGroup>
    • पहला भाग TextTransform.exe का पता लगाता है

    • $(IncludeForTransform)समान होगा c:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dllक्योंकि कमांड लाइन पर TextTransform के लिए संदर्भ जोड़ने का तरीका है

       <Target Name="TransformOnBuild" BeforeTargets="BeforeBuild">
         <!--<Message Text="$(IncludeForTransform)" />-->
         <Error Text="Failed to find TextTransform.exe tool at '$(_TransformExe)." Condition="!Exists('$(_TransformExe)')" />
         <ItemGroup>
           <_TextTransform Include="$(ProjectDir)**\*.tt" />
         </ItemGroup>
         <!-- Perform task batching for each file -->
         <Exec Command="&quot;$(_TransformExe)&quot; &quot;@(_TextTransform)&quot; -r &quot;$(IncludeForTransform)&quot;" Condition="'%(Identity)' != ''" />
       </Target>
    • <_TextTransform Include="$(ProjectDir)**\*.tt" />यह प्रोजेक्ट और उपनिर्देशिकाओं के अंदर सभी tt फ़ाइलों की सूची बनाता है

    • <Exec Command="... प्रत्येक .tt फ़ाइलों के लिए एक लाइन का उत्पादन करता है जो दिखता है "C:\path\to\Transform.exe" "c:\path\to\my\proj\TransformFile.tt" -r"c:\path\to\foo.dll" -r "c:\path\to\bar.dll"

  4. केवल एक चीज को छोड़ना है, जो अंदर के dll को पथ जोड़ता है:

        <ItemGroup>
          <DllsToInclude Include="$(ProjectDir)path\to\foo.dll">
            <InProject>False</InProject>
          </DllsToInclude>
          <DllsToInclude Include="$(ProjectDir)path\to\bar.dll">
            <InProject>False</InProject>
          </DllsToInclude>
        </ItemGroup>

    यहाँ <InProject>False</InProject>समाधान दृश्य से इन वस्तुओं को छुपाता है

तो अब आपको dll-s के निर्माण और परिवर्तन पर अपना कोड बनाने में सक्षम होना चाहिए।

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


कृपया अधिक संदर्भ प्रदान करने के लिए अपने उत्तर में समाधान जोड़ें। लिंक प्रश्न का कोई समाधान नहीं हैं और जब अन्य उपयोगकर्ता इस प्रश्न पर वापस आते हैं तो मृत हो सकते हैं।
फ्रैंक वैन विजक

1

T4Executer VS2019 के लिए ऐसा करता है। आप बिल्ड को अनदेखा करने के लिए टेम्पलेट निर्दिष्ट कर सकते हैं, और बिल्ड विकल्प के बाद एक निष्पादन है।


1

आप बस NuGet पैकेज स्थापित करें: Clarius.TransformOnBuild

फिर, हर बार जब आप पुनर्निर्माण परियोजना (या समाधान) पर क्लिक करते हैं, तो आपकी .tt फाइलें चलेंगी


1

Visual Studio 2017 (शायद अगले संस्करण भी) में, आपको इसे प्री-बिल्ड ईवेंट में जोड़ना चाहिए:

"$(DevEnvDir)TextTransform.exe" -out "$(ProjectDir)YourTemplate.cs" "$(ProjectDir)YourTemplate.tt"

। रूट टेम्प्लेट डायरेक्टरी में नहीं होने पर अपने टेम्प्लेट में पथ बदलें।


0

कुछ लोगों ने इसके लिए एक नगेट पैकेज बनाया ।

साइड नोट: मुझे TextTemplate.exe और उस पैकेज दोनों से संकलित त्रुटियां मिलती हैं (क्योंकि वह पैकेज TextTemplate.exe को कॉल करता है) लेकिन विजुअल स्टूडियो से नहीं। तो जाहिर है कि व्यवहार समान नहीं है; सचेत।

संपादित करें: यह मेरी समस्या है।


0

यहाँ केवल Microsoft टूलींग और मानक रास्तों का उपयोग करके एक पूर्व-निर्माण घटना है। इसका परीक्षण vs2019 / netcore3.1 में किया गया है।

अपने प्रोजेक्ट-सापेक्ष फ़ाइल पथ के साथ "AppDbContext.tt" बदलें:

"$(MSBuildBinPath)\msbuild" $(SolutionPath) /t:$(ProjectName):Transform /p:TransformFile="AppDbContext.tt" /p:CustomAfterMicrosoftCommonTargets="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets"

Microsoft के पास आपकी परियोजना फ़ाइल में T4ParameterValues का उपयोग करके टेम्पलेट में "$ (SolutionDirectory)" जैसे मैक्रोज़ उपलब्ध कराने के लिए एक गाइड भी है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.