Отримайте Visual Studio для запуску шаблону T4 для кожної збірки


163

Як я можу отримати шаблон T4 для отримання результатів для кожної збірки? Як і зараз, він відновлює його лише тоді, коли я вношу зміни до шаблону.

Я знайшов інші питання, подібні до цього:

Перетворення T4 та порядок побудови у Visual Studio (без відповіді)

Як отримати файли t4 для створення у візуальній студії? (відповіді недостатньо деталізовані [в той час як вони ще досить складні] і навіть не мають тотального сенсу)

Має бути простіший спосіб зробити це!


Хоча мені особисто було б дуже цікаво почути відповідь на це, який ваш конкретний сценарій? Зазвичай виведення шаблону повинно бути функцією лише введення, тому генерування змін змінюється нормально.
Павло Мінаєв

6
Мій шаблон використовує відображення для вивчення інших збірок, які, можливо, змінилися з моменту останньої збірки.
JoelFan


Мій шаблон служить одній цілі, записувати час складання дати.
Скотт Солмер

Відповіді:


68

Я використовував відповідь Джоельфана, щоб придумати це. Мені це подобається краще, тому що вам не потрібно пам'ятати, щоб змінювати подію попереднього збирання щоразу, коли ви додаєте новий .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
Приємне рішення. Я вважав за краще ввести повний шлях до TextTransform.exe ( "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe") у пакетному файлі, а не додавати його до% PATH%
Адам Нофсінгер

20
Кращою змінною буде% COMMONPROGRAMFILES (x86)% замість% COMMONPROGRAMFILES%, оскільки це також буде працювати в 64-бітовій системі.
Durden81

3
Тож повний шлях буде %COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe. Загорніть його в подвійні лапки.
northben

1
@ piers7: я оновив код, щоб автоматично визначити "біт" ОС, що працює під сценарієм. Я також включив коментар northben, щоб пропустити каталог obj і реалізував перевагу Адама Нофсінгера щодо того, щоб не змінювати змінну середовища% PATH%.
Алекс Ессільфі

1
ІМХО потрібно забезпечити шлях до TextTransform.exeсмоктання. Ви вже можете клацнути правою кнопкою миші «Запустити спеціальний інструмент» у Visual Studio, тому він вже має шлях до інструменту. Чому я мушу знову переглядати роботу, коли будую її з контексту Visual Studio?
Єз

70

Я погоджуюся з GarethJ - у VS2010 набагато простіше відновлювати шаблони tt у кожній збірці. У блозі Олега Сича описано, як це зробити. Коротко:

  1. Встановіть Visual Studio SDK
  2. Встановіть SDK для моделювання та візуалізації Visual Studio 2010
  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
Ось посилання на допис у блозі Олега Сича: olegsych.com/2010/04/understanding-t4-msbuild-integration
PhilChuang

4
Це дуже приємне рішення. Однак чи є спосіб змусити це працювати, не вимагаючи встановлення SDK? Я намагався змусити його працювати, копіюючи файли .targets та пов'язані збірки, але без успіху.
grimus

3
Здається, Chirpy працює без завантаження будь-яких SDK ... однак вам все одно доведеться завантажити та налаштувати Chirpy. Я все ще намагаюся знайти рішення, яке працює при встановленні за замовчуванням VS2010, і воно буде доступне через вихідний сховище, тому розробникам потрібно лише перевірити репо, щоб він працював. Всі ці інші рішення потребують занадто великої уваги кожного розробника.
Мир

1
Якщо ви будуєте свої проекти за допомогою версії MSBuild x64 - ви отримаєте цю помилку: 'MSB4019: імпортний проект "C: \ програмні файли (x86) \ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating.targets "не знайдено." помилка. Обхід - замініть змінну $ (MSBuildExtensionsPath) на $ (MSBuildExtensionsPath32) у файлі проекту.
Іржавий

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
Джуліо Віан

29

Є чудовий пакет NuGet, який робить саме це:

PM> Install-Package Clarius.TransformOnBuild

Детальну інформацію про пакет можна знайти тут


2
Є "неофіційна" вилка: nuget.org/packages/Clarius.TransformOnBuild-unofficial, яка підтримує contentдії для збирання
Erno

1
Це приємне розширення, але він працює TextTransform.exe в режимі commandLine, тож hostspecific = "справжні" функції не працюватимуть
Gh61

1
@JenishRabadiya Додайте цей рядок у верхню частину шаблону:<#@ template language="C#" #>
Пітер ван Кекем

2
Здається, пакет оновлено для підтримки hostspecific = "true" та інших проблем (8 днів тому)
Mingwei Samuel

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. Перейдіть у Build Events і додайте наступний командний рядок попереднього збирання події :

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

заміна MyTemplate на ім'я вашого файлу .tt (тобто MyTemplate.tt) без розширення .tt. Це призведе до розширення шаблону для створення MyTemplate.cs перед створенням проекту. Тоді фактична збірка складе MyTemplate.cs


хоча я до сих пір є проблема: stackoverflow.com/questions/1669893 / ...
JoelFan

1
Не забудьте цитати навколо $ (SolutionDir) .. \ .. \ tools \ RunTemplate.bat
Евальд Хофман

14

Нещодавно знайшов цей чудовий плагін VS, Chirpy .

Він не тільки генерує ваш T4 під час складання, але дозволяє на основі T4 підходити до мінімізації javascript, CSS і навіть дозволяє використовувати менший синтаксис для свого CSS!


13

Напевно, найпростіший спосіб - встановити розширення Visual Studio під назвою AutoT4 .

Він запускає всі шаблони T4 на збірку автоматично.


Домовились! Конфігурується та працює з VS 2015. Він навіть підтримує використання збірки EnvDTE (для отримання конфігурації збірки), що не всі методи роблять. Єдиним недоліком є ​​те, що всі члени команди мають встановити розширення.
Гіроміт

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"

Звичайно, ви можете витягнути це у пакетний файл, до якого ви переходите шлях до каталогу каталогу, якщо бажаєте.

NB. На шляху може знадобитися певне налаштування. Шлях вище, де VS 2008 встановив його на моїй машині; але ви можете виявити, що номер версії між TextTemplatingі TextTransform.exeвідрізняється.


@SprintStar, якщо у вас є VS 2012, мабуть, кращий спосіб зробити це. Інші відповіді говорять про кращі способи, які вже існують для VS 2010.
Пітер Тейлор

Це найкращий метод, тому що мені нічого не потрібно встановлювати.
Райан Гейтс

1
Побачив, що не було 1,2, але був 12,0, тому змінив його, але отримав цю помилку:System.Exception: T4MVC can only execute through the Visual Studio host
colmde

1
Просто довелося оновити шлях до папки, щоб використовувати 14,0 замість 1,2 і добре йти.
пістолет-піт

На моє переконання, це було найкращим рішенням (лише змінивши 14,0, як згадувалося вище)
Нельсон Родрігес

9

Перевірте C: \ Program Files (x86) \ Загальні файли \ Microsoft Shared \ TextTemplating там є exe перетворення командного рядка. Крім того, напишіть MSBuild завдання зі спеціальним хостом і зробіть перетворення самостійно.


1
О, хоча ви можете робити такі речі, як "devenv / Command TextTransformation.TransformAllTemplates / Command File.Exit MySolution.sln" в 2010 році, вона має тенденцію час від часу перерватися на сервери збірки. Ваша найкраща ставка - написати MSBuild завдання зі спеціальним хостом.
MarkGr

Для побудови на робочому столі просто зробіть макрос, який робить TransformAllTemplates, а потім збірку.
MarkGr

7

Розширюється на Сет-Рено та Джоельфана , я придумав це. З цим рішенням не потрібно пам'ятати, щоб змінювати подію попереднього збирання щоразу, коли ви додаєте новий .tt файл у проект.

Порядок виконання

  • Створіть пакетний файл з назвою transform_all.bat (див. Нижче)
  • Створіть подій перед складанням transform_all.bat "$(ProjectDir)" $(ProjectExt)для кожного проекту за допомогою .tt, який ви хочете створити

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Файли повинні бути в каталозі проектів, інакше вони не збираються. Ви можете створювати файли TT за межами каталогу проекту, вказавши інший шлях в якості першого аргументу ( тобто замініть "$(ProjectDir)"на шлях, що містить файли TT.)

  3. Не забудьте також встановити правильний шлях до transform_all.batпакетного файлу.
    Наприклад, я помістив його у свій каталог рішень, щоб подія попередньої збірки була наступною"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)


Я намагаюся використовувати такий підхід, але я все одно отримую помилку, оскільки "\ Common на цей час було несподіваним." в моєму виході. Це відбувається прямо в цьому рядку: для / f "delims =" %% d in (t4list.txt) робити ... Будь-яка ідея, чого мені не вистачає?
Майкл Льюїс

@MichaelLewis: Я декілька разів переглядав пакетний файл, не помічаючи, що може спричинити помилку. Будь ласка, спробуйте метод, запропонований Сет Рено, щоб побачити, чи не генерує ту саму помилку. Тим часом, чи можете ви, будь ласка, опублікувати свій t4list.txtфайл у PasteBin, щоб я спробував побачити, чи не надходить ваша помилка звідти?
Алекс Ессільфі

Я спробував підхід Сетя з тією ж проблемою ("\ Common на цей час було несподівано"). Я не можу розмістити файл t4list.txt через корпоративні обмеження, але він складається з одного рядка, і \ Common не з'являється на шляху.
Майкл Льюїс

@MichaelLewis: На жаль, якщо ваша помилка трапляється в for /f "delims=" %%d in (t4list.txt) do (і корпоративні обмеження не дозволяють вам публікувати ваш t4list.txtфайл, то, я боюся, я не можу зробити, щоб допомогти вам. Мені дуже хотілося допомогти вирішити це, але, схоже, це стане неможливо, оскільки у мене немає даних для продовження. Удачі у вирішенні проблеми та ласкаво пам’ятайте, щоб опублікувати своє рішення, коли ви досягнете успіху.
Алекс Ессільфі

Чи можна зробити те ж саме, коли містить tt(this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; ? На жаль, я отримую нульовий довідковий виняток , коли запускаю tt з не всередині візуальної студії.
Андрій К.

6

Якщо ви використовуєте Visual Studio 2010, ви можете використовувати SDK для моделювання та візуалізації Visual Studio: http://code.msdn.microsoft.com/vsvmsdk

Це містить завдання msbuild для виконання шаблонів T4 під час збирання.

Перегляньте блог Олега, щоб отримати додаткові пояснення: 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

Dynamo.AutoTT зробить те, що потрібно. Ви можете налаштувати його для перегляду файлів через регулярний вираз або генерування в процесі нарощування. Це також дозволяє вказати, які шаблони T4 ви бажаєте його запустити.

Ви можете завантажити його тут: https://github.com/MartinF/Dynamo.AutoTT

Просто побудуйте його, скопіюйте файли dll та AddIn у файли

C: \ Користувачі \ Документи \ Visual Studio 2012 \ Addins \

і геть ти йдеш.

Якщо ви хочете, щоб це почалося у VS2012, вам потрібно буде змінити файл Dynamo.AutoTT.AddIn і встановити Версію на 11.0 у файлі AddIn;


3

Завдяки GitHub.com/Mono/T4 , на даний момент ви можете це зробити як для .NET Core, так і для Visual Studio, додаючи це у свій .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>

і просто запустіть збірку двічі (вперше). Якщо ви вже створили файли, прив’язані до сховища, з обома прикладами не буде проблем із перебудовою.

У Visual Studio ви можете побачити щось подібне:

введіть тут опис зображення

замість цього:

введіть тут опис зображення

Тому додайте щось подібне до файлу проекту:

  <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 не лише в проекті, а ми не хочемо запускати все ...
Landeeyo

3
У папці v11.0 у мене немає TextTemplating. Звідки ти це береш?
Зак

1

У візуальній студії 2013 клацніть правою кнопкою миші шаблон шаблону T4 і встановіть властивість перетворення на збірку в істинне.


1
Мені не вдається знайти цю опцію в меню правої кнопки миші, проте згідно з MSDN це можна зробити, відредагувавши проектний файл у VS 2012 та 2013, див. Msdn.microsoft.com/en-us/library/ee847423. aspx або msdn.microsoft.com/en-us/library/vstudio/ee847423.aspx для деталей
yoel halb

Здається, це варіант, який постачається лише з відчутними інструментами T4, але не за замовчуванням у Visual Studio.
Метт Дітроліо

Так, це лише у професійній версії T4 Toolbox.
Помпара

1

Ось, як я його вирішив. Link . В основному, на основі чудового блогу (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ не можна розмістити більше 2 посилання :() Я придумав цей файл .targets для використання з візуальними файлами програми студії.

Це корисно, коли ви використовуєте інші dll-s всередині свого .tt, і ви хочете, щоб результат мінявся в міру зміни dll-s.

Як це працює:

  1. Створіть tt, додайте ім'я зборки = "$ (SolutionDir) \ \ до \ 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.

Ви можете видалити користувальницький інструмент (із властивостей всередині Visual Studio), щоб VS не намагався щоразу перетворювати та виходити з ладу. Оскільки ми видалили посилання на збірку на кроці 2


Будь ласка, додайте рішення у свою відповідь, щоб забезпечити більше контексту. Посилання не є вирішенням питання і можуть бути загиблими, коли інші користувачі повернуться до цього питання пізніше.
Франк ван Війк

1

T4Executer робить це для VS2019. Ви можете вказати шаблони, які слід ігнорувати при складанні, і є опція Execute after build.


1

Ви просто встановите пакет NuGet : Clarius.TransformOnBuild

Потім, кожного разу, коли ви натискаєте « Відновити проект» (або рішення), ваші .tt- файли запускатимуться


1

У Visual Studio 2017 (можливо, і наступні версії) слід додати це у події попереднього збирання:

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

ps Змініть шлях до вашого шаблону, якщо він розташований не в кореневій директорії проекту.


0

Якийсь хлопець побудував для цього пакунок із нутами .

Бічна примітка: я отримую помилки компіляції як із TextTemplate.exe, так і з цього пакету (тому що цей пакет викликає TextTemplate.exe), але не від Visual Studio. Отже, мабуть, поведінка не однакова; голови вгору.

EDIT: Це врешті-решт стало моєю проблемою.


0

Ось подія перед складанням, використовуючи лише Microsoft Tooling та стандартні шляхи. Це тестується в 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 також має посібник, щоб зробити макроси типу "$ (SolutionDirectory)" доступними у шаблоні, використовуючи T4ParameterValues у файлі проекту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.