दिलचस्प पोस्ट
AsyncTaskLoader बनाम AsyncTask उद्धरण चिह्नों में टिल्ड विस्तार मोंगोडीबी / मोंगोज एक विशिष्ट तिथि पर पूछताछ करते हैं? एक कक्षा से pthread फ़ंक्शन मैं एक सूची <टी> से हर एनटी आइटम कैसे प्राप्त कर सकता हूं? उपप्रोसेस: विंडोज में बाल प्रक्रियाएं हटाना Android कैमरा android.hardware.Camera बहिष्कृत पायथन – ई-मेल हैडर डीकोडिंग यूटीएफ -8 त्रुटि: "गैर-स्थिर फ़ील्ड, विधि या प्रॉपर्टी के लिए ऑब्जेक्ट संदर्भ आवश्यक है …" डिबग मोड में लॉन्च किए जाने पर एंड्रॉइड ऐप क्रैश हो जाता है क्लास ऑब्जेक्ट के लिए कस्टम स्ट्रिंग का प्रतिनिधित्व कैसे करें? उद्देश्य-सी में एक स्ट्रिंग में एक अक्षर को बदलना एनपीएम पैकेज। जेएसएन फ़ाइल में निर्भरता, देवता और पीयर निर्भरता के बीच अंतर क्या है? परमाणु लेखन पायथन के साथ फाइल करने के लिए NSMutableArray को घुमाए जाने का सबसे अच्छा तरीका क्या है?

प्रत्येक बिल्ड पर एक T4 टेम्पलेट चलाने के लिए विजुअल स्टूडियो प्राप्त करें

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

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

टी 4 रूपांतरण और विजुअल स्टूडियो में ऑर्डर का निर्माण (अनुत्तरित)

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

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

वेब के समाधान से एकत्रित समाधान "प्रत्येक बिल्ड पर एक T4 टेम्पलेट चलाने के लिए विजुअल स्टूडियो प्राप्त करें"

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

  • अपने %PATH% TextTransform.exe जोड़ें
  • transform_all.bat नामक बैच फ़ाइल बनाई गई (नीचे देखें)
  • एक पूर्व-बिल्ड इवेंट " transform_all ..\.. बनाएँ 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 

मैं गैरेथ से सहमत हूं – VS2010 में प्रत्येक बिल्ड पर टीटी टेम्पलेट को पुन: उत्पन्न करना बहुत आसान है I ओलेग सिच का ब्लॉग वर्णन करता है कि यह कैसे करना है। संक्षेप में:

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

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

 <!-- 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" /> 

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

 "%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 का पथ है।

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

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

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

एक महान NuGet पैकेज है जो यह करता है:

 PM> Install-Package Clarius.TransformOnBuild 

पैकेज के बारे में जानकारी यहां पाई जा सकती है

हाल ही में यह महान वीएस प्लगइन, चिरपी मिला ।

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

प्री-बिल्ड को एक पंक्ति में कम किया जा सकता है:

 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" 

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

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

संभवतः सबसे आसान तरीका है कि एक ऑटटी 4 नामक विज़ुअल स्टूडियो एक्सटेंशन स्थापित किया जाए ।

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

सी की जांच करें: \ प्रोग्राम फ़ाइलें (x86) \ सामान्य फ़ाइलें \ Microsoft साझा \ TextTemplating वहाँ एक कमांड लाइन रूपांतरण EXE है वैकल्पिक रूप से एक कस्टम होस्ट के साथ एक MSBuild कार्य लिखें और स्वयं को रूपांतरित करें

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

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

  • ट्रांस्ड_ऑल.बैट नामक एक बैच फ़ाइल बनाएं (नीचे देखें)
  • प्रत्येक प्रोजेक्ट को .tt के निर्माण के लिए एक प्री-बिल्ड इवेंट 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)

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

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

अधिक स्पष्टीकरण के लिए ओलेग के ब्लॉग पर एक नज़र डालें: http://www.olegsych.com/2010/04/understanding-t4- मिस्बिल्ड -इंठन

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

 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 फाइलों को स्वचालित रूप से बदल दिया जाएगा।

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

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

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

सी: \ उपयोगकर्ता \ दस्तावेज़ \ विजुअल स्टूडियो 2012 \ Addins \

और दूर तुम जाओ

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

इस पर एक और अच्छा लेख: एक बिल्ड प्रक्रिया में कोड जनरेशन

2012 मॉडलिंग और विज़ुअलाइज़ेशन एसडीके डाउनलोड लिंक:

https://www.microsoft.com/en-us/download/details.aspx?id=30680

कृपया mhutch का उत्तर https://stackoverflow.com/a/1395377/9587 देखें

आईएमएचओ, यह सबसे अच्छा बिल्ड सर्वर और देव पर्यावरण अनुकूल विकल्प है।

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

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)" 

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

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

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

विजुअल स्टूडियो 2013 में, टी 4 टेम्पलेट पर राइट क्लिक करें और सही पर बिल्ड प्रॉपर्टी पर ट्रांसफ़ॉर्म सेट करें।

कुछ लड़के ने इसके लिए एक नूग पैकेज का निर्माण किया।

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

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

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

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

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

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

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

     <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' -rc:\path\to\dll\bar.dll क्योंकि यह कमांड लाइन पर टेक्स्ट ट्रांसफॉर्मर के लिए संदर्भ जोड़ने का तरीका है

        <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" /> यह परियोजना और उपनिर्देशिका के अंदर सभी टीटी फ़ाइलों की एक सूची बनाता है

    • <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" दिखती हैं "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. केवल एक चीज को छोड़ दिया जाता है जिसमें डीएलएस के अंदर पथ शामिल हैं:

      <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 में विधानसभा संदर्भ हटा दिए हैं