سؤال

كيف يمكنني الحصول على قالب T4 لإنشاء مخرجاته في كل إصدار؟كما هو الحال الآن، فإنه يتم تجديده فقط عندما أقوم بإجراء تغيير على القالب.

لقد وجدت أسئلة أخرى مشابهة لهذا:

تحويل T4 وترتيب البناء في Visual Studio (بدون إجابة)

كيفية الحصول على ملفات t4 للبناء في الاستوديو المرئي؟ (الإجابات ليست مفصلة بما فيه الكفاية [بينما لا تزال معقدة للغاية] وليست منطقية تمامًا)

يجب أن تكون هناك طريقة أبسط للقيام بذلك!

هل كانت مفيدة؟

المحلول

لقد استخدمت إجابة JoelFan للتوصل إلى هذا.يعجبني أكثر لأنه ليس عليك أن تتذكر تعديل حدث ما قبل البناء في كل مرة تقوم فيها بإضافة ملف .tt جديد إلى المشروع.

  • قم بإضافة TextTransform.exe إلى ملفك %PATH%
  • إنشاء ملف دفعي باسم Transform_all.bat (انظر أدناه)
  • إنشاء حدث ما قبل البناء "transform_all ..\.."

تحويل_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

نصائح أخرى

وأنا أتفق مع GarethJ - في VS2010، أصبح من الأسهل بكثير إعادة إنشاء قوالب tt في كل إصدار.تصف مدونة Oleg Sych كيفية القيام بذلك.باختصار:

  1. ثَبَّتَ فيجوال ستوديو اس دي كيه
  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" />

وهناك مجموعة كبيرة NuGet ان يفعل ذلك بالضبط هذا:

PM> Install-Package Clarius.TransformOnBuild

وتفاصيل حول حزمة يمكن أن يكون <لأ href = "http://blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio- SDK / "> وجدت هنا

لقد استخدمت إجابة 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

يأخذ هذا الملف الدفعي معلمتين ... %1 هو المسار إلى الملف .tt بدون الملحق .tt. %2 هو المسار إلى أي مكتبات الارتباط الحيوي (DLL) المشار إليها بواسطة حَشد التوجيهات في القالب.

بعد ذلك، انتقل إلى خصائص المشروع الخاص بالمشروع الذي يحتوي على قالب T4.اذهب داخل بناء الأحداث وأضف ما يلي سطر أوامر حدث ما قبل الإنشاء:

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

استبدال MyTemplate مع اسم الملف الخاص بملف tt الخاص بك (أيMyTemplate.tt) بدون الامتداد .tt.سيكون هذا نتيجة توسيع القالب لإنتاج MyTemplate.cs قبل إنشاء المشروع.ثم سيقوم البناء الفعلي بتجميع MyTemplate.cs

ومؤخرا وجدت هذا عظيم VS المساعد، مرح .

وليس فقط أنها لا تولد T4 الخاص على بناء، لكنه يسمح النهج القائم على T4 لتصغير الحجم جافا سكريبت، CSS، وحتى يتيح لك استخدام جملة أقل لCSS الخاص بك!

ربما تكون أبسط طريقة هي تثبيت ملحق Visual Studio يسمى أوتو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"

بالطبع، يمكنك سحب هذا إلى ملف دفعي تمرر إليه مسار دليل المشروع إذا كنت ترغب في ذلك.

ملحوظة: قد يتطلب المسار بعض التغيير والتبديل.المسار أعلاه هو المكان الذي قام فيه VS 2008 بتثبيته على جهازي؛ولكن قد تجد أن رقم الإصدار بين TextTemplating و TextTransform.exe مختلف.

وراجع C: \ ملفات البرنامج (x86) و \ الملفات \ Microsoft المشتركة \ TextTemplating المشتركة هناك إكس التحول سطر الأوامر في هناك. بدلا من إرسال مهمة MSBuild مع مجموعة مخصصة ولا التحويل نفسك.

التوسع في سيث رينو و جويلفان الإجابات، جئت مع هذا.مع هذا الحل، لا تحتاج إلى تذكر تعديل حدث ما قبل البناء في كل مرة تقوم فيها بإضافة ملف .tt جديد إلى المشروع.

إجراءات التنفيذ

  • قم بإنشاء ملف دفعي باسم Transform_all.bat (انظر أدناه)
  • إنشاء حدث ما قبل البناء transform_all.bat "$(ProjectDir)" $(ProjectExt) لكل مشروع بـ .tt تريد إنشاءه

تحويل_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 يجب أن تكون الملفات في دليل المشروع وإلا فلن يتم إنشاؤها.يمكنك إنشاء ملفات TT خارج دليل المشروع عن طريق تحديد مسار مختلف كوسيطة أولى (أي. يستبدل "$(ProjectDir)" بالمسار الذي يحتوي على ملفات TT.)

  3. تذكر أيضًا تعيين المسار الصحيح لـ transform_all.bat ملف دفعي.
    على سبيل المثال، قمت بوضعه في دليل الحلول الخاص بي، لذا كان حدث ما قبل الإنشاء كما يلي "$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)

إذا كنت تستخدم Visual Studio 2010، يمكنك استخدام البصرية ستوديو نمذجة والتصور SDK: http://code.msdn.microsoft.com/vsvmsdk

وهذا يحتوي على المهام msbuild لتنفيذ قوالب T4 في وقت الإنشاء.

وإلقاء نظرة على بلوق أوليغ لمزيد من التوضيح: http://www.olegsych.com/2010/04/understanding-t4 -msbuild التكامل

ومهلا، مخطوطتي يمكن أيضا تحليل تمديد الانتاج

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 في الحل بالعمل تلقائيا.

سوف يقوم Dynamo.AutoTT بفعل ما تحتاجه.يمكنك تكوينه لمشاهدة الملفات عبر regex أو إنشاءها عند الإنشاء.كما يسمح لك بتحديد قوالب T4 التي تريد تشغيلها.

يمكنك تحميل البرنامج من هنا : https://github.com/MartinF/Dynamo.AutoTT

ما عليك سوى بنائه ونسخ ملفات dll وAddIn إلى

C:\المستخدمين\المستندات\Visual Studio 2012\Addins\

وتذهب بعيدا.

إذا كنت تريد البدء في VS2012، فستحتاج إلى تعديل ملف Dynamo.AutoTT.AddIn وتعيين الإصدار إلى 11.0 داخل ملف AddIn؛

وهنا هو بلدي الحل - على غرار الجواب المقبول. كان لدينا مشكلة مع التحكم بالمصادر لدينا. للقراءة فقط الملفات الهدف .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

ويمكنك محاولة لإضافة أمر إنهاء إجراءات المغادرة الخاصة بك على خط (:: يمكنك محاولة ....)

في مشروعك تعيين هذه كإجراء prebuild:

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، انقر على الحق في قالب T4 وتعيين التحويل على بناء الممتلكات إلى true.

هنا كيف تعاملت معها. وصلة.البناء بشكل أساسي على مدونة رائعة ( blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ لا يمكنه نشر أكثر من 2 الروابط :( ) توصلت إلى هذا .الأهداف ملف للاستخدام مع ملفات Visual Studio proj.

يكون ذلك مفيدًا عند استخدام ملفات dll-s أخرى داخل ملف .tt الخاص بك وتريد أن تتغير النتيجة مع تغير ملفات dll-s.

كيف تعمل:

  1. قم بإنشاء tt، وأضف اسم التجميع = "$(SolutionDir)path o\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.

يمكنك إزالة الأداة المخصصة (من الخصائص الموجودة داخل Visual Studio) حتى لا يحاول VS التحويل والفشل الذريع في كل مرة.لأننا قمنا بإزالة مراجع التجميع في الخطوة 2

T4Executer يفعل هذا لVS2019. يمكنك تحديد قوالب تجاهل على بناء، وهناك خيار تنفيذ الإنشاء بعد.

<وأ href = "http://blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/" يختلط = " نوفولو noreferrer "> بعض الرجل بنى nuget حزمة للحصول على هذا.

ملاحظة جانبية: أحصل على تجميع الأخطاء من كلا TextTemplate.exe وأن الحزمة (لأن ذلك حزمة تدعو TextTemplate.exe) ولكن ليس من برنامج Visual Studio. لذلك يبدو أن السلوك ليس هو نفسه. يرأس.

وتحرير: انتهت هذه الأمر مشكلتي

.

ما عليك سوى تثبيت حزمة NuGet: Clarius.TransformOnBuild

ثم، في كل مرة تقوم بالنقر فوق إعادة بناء المشروع (أو الحل)، الخاص بك .tt سيتم تشغيل الملفات

وفي Visual Studio 2017 (الإصدارات القادمة ربما أيضا)، يجب أن تضيف هذا في حالة ما قبل البناء:

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

وp.s. تغيير مسار القالب الخاص بك إذا كان موجود لا في دليل المشروع الجذر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top