Получить Visual Studio для запуска шаблона T4 на каждой сборке
Как мне получить шаблон T4 для генерации его вывода на каждой сборке? Как и сейчас, он только восстанавливает его, когда я делаю изменения в шаблоне.
Я нашел другие вопросы, подобные этому:
преобразование T4 и порядок сборки в Visual Studio (без ответа)
Как получить T4 файлы для сборки в visual studio? (ответы недостаточно подробны [в то же время достаточно сложны] и даже не имеют общего смысла)
есть есть чтобы быть более простым способом сделать это!
19 ответов:
я использовал ответ Джоэльфана, чтобы придумать это. Мне это нравится больше, потому что вам не нужно помнить, чтобы изменить событие pre-build каждый раз, когда вы добавляете новый файл .tt в проект.
- добавить TextTransform.exe в
%PATH%- создан пакетный файл с именем transform_all.летучая мышь (см. ниже)
- создать событие предварительной сборки"
transform_all ..\.."transform_all.летучая мышь
@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 на каждой сборке. Блог Олега Сыча описывает, как это сделать. Короче говоря:
- установить Visual Studio SDK
- установить Моделирование Visual Studio 2010 и визуализация SDK
- открыть в текстовом редакторе файл проекта и добавить в конец файла, но перед
</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подробности о пакете могут быть найти здесь
я использовал ответ MarkGr и разработал это решение. Во-первых, создайте пакетный файл с именем RunTemplate.летучая мышь в отдельную инструменты папка над основной папкой решения. Пакетный файл просто имеет строку:
"%CommonProgramFiles%\Microsoft Shared\TextTemplating.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 (т. е. MyTemplate.tt) без расширения .tt. Это будет иметь результат расширения шаблона для создания MyTemplate.CS, перед построением проекта. После фактической сборки скомпилировать шаблон mytemplate.cs
недавно нашел этот отличный плагин VS, Chirpy.
Он не только генерирует ваш T4 на сборке, но и позволяет использовать T4-подход к минимизации javascript, CSS и даже позволяет использовать меньше синтаксиса для вашего CSS!
предварительная сборка может быть сведена к одной строке:
forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c echo Transforming @path && \"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating.2\TextTransform.exe\" @file"это превращает все
.ttфайлы в проекте и перечисляет их в выводе сборки.если вы не хотите строить вывод, то вы должны обойти некоторые "интересное поведение":
forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c @\"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating.2\TextTransform.exe\" @file"конечно, вы можете вытащить это в пакетный файл, в который вы передаете путь к каталогу проекта, если хотите.
NB путь может потребовать тонкая настройка. Путь выше, где VS 2008 установил его на моей машине; но вы можете обнаружить, что номер версии между
TextTemplatingиTextTransform.exeразное.
вероятно, самый простой способ-установить расширение Visual Studio под названием AutoT4.
он запускает все шаблоны T4 на сборке автоматически.
проверить C:\Program файлы (x86)\Общие файлы\Microsoft Shared\TextTemplating там есть преобразование командной строки exe. В качестве альтернативы напишите задачу MSBuild с пользовательским хостом и выполните преобразование самостоятельно.
расширения Сэт Рено и JoelFan это ответы, я придумал это. С помощью этого решения не нужно помнить, чтобы изменить событие предварительной сборки каждый раз, когда вы добавляете новый файл .tt в проект.
Порядок Выполнения
- создайте пакетный файл с именем transform_all.летучая мышь (см. ниже)
- создать событие предварительной сборки
transform_all.bat "$(ProjectDir)" $(ProjectExt)для каждого проекта с A. tt вы хотите стройtransform_all.летучая мышь
@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.2\ ) else ( echo 64-bit OS detected set ttPath=%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating.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
Примечания
преобразование текста предполагает, что код в шаблоне T4 является тем же языком, что и тип проекта. Если этот случай не относится к вам, то вам придется заменить
Если вы используете Visual Studio 2010, Вы можете использовать Visual Studio Modeling and Visualization SDK: http://code.msdn.microsoft.com/vsvmsdk
содержит задачи msbuild для выполнения шаблонов T4 во время сборки.
посмотрите на блог Олега для более подробного объяснения: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration
Привет, мой скрипт также может анализировать расширение вывода
for /r %1 %%f in (*.tt) do ( for /f "tokens=3,4 delims==, " %%a in (%%f) do ( if %%~a==extension "%CommonProgramFiles%\Microsoft Shared\TextTemplating.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)pre-build событие, и все *.tt файлы в вашем решении будут преобразованы автоматически.
"Динамо".AutoTT сделает то, что вам нужно. Вы можете настроить его для просмотра файлов через регулярное выражение или генерировать при сборке. Она также позволяет указать, какие шаблоны T4 вы хотите вызвать.
вы можете скачать его здесь:https://github.com/MartinF/Dynamo.AutoTT
просто постройте его, скопируйте dll и добавьте файлы в
C:\Users\Documents\Visual Studio 2012\Addins\
и вы уходите.
Если вы хотите получить его идя в VS2012 вам нужно будет изменить динамо-машину.Автотт.Добавить файл и установить версию 11.0 внутри файла добавления;
еще одна хорошая статья на этот: генерация кода в процессе сборки
2012 моделирование и визуализация SDK ссылка для скачивания:
https://www.microsoft.com/en-us/download/details.aspx?id=30680
пожалуйста, смотрите ответ mhutch https://stackoverflow.com/a/1395377/9587
IMHO, это лучший сервер сборки и dev environment friendly вариант.
вот мое решение-аналогично принятому ответу. У нас была проблема с нашей системой управления версиями. Цель. файлы cs доступны только для чтения, и T4 не удалось. Вот код, который запускает T4 в папке temp, сравнивает целевые файлы и копирует его только в случае такого же изменения. Это не устраняет проблему с чтением.только файлы, но по крайней мере это происходит не очень часто:
трансформировать.летучая мышь
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.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.0\TextTransform.exe" "%ttFile%" ) ELSE ( ECHO no change in %csFile% ) del %tempTT% del %tempCS% goto :eof :Endвы можете попробовать добавить команду check-out в строке (:: вы можете попробовать ....)
в вашем проекте установите это как предварительно построенное действие:
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проверка на configuration = debug, гарантирует, что вы не регенерируете код в режиме выпуска, когда вы выполняете сборку на сервере сборки TFS, например.
в visual studio 2013 щелкните правой кнопкой мыши шаблон T4 и установите для свойства transform on build значение true.
какой-то парень построил пакет nuget для этого.
боковое примечание: Я получаю ошибки компиляции из обоих TextTemplate.exe и этот пакет (потому что этот пакет вызывает TextTemplate.exe), но не из Visual Studio. Так что, по-видимому, поведение не то же самое; головы вверх.
EDIT:этой в конечном итоге это моя проблема.
вот как я прикрепил его. ссылке. В основном здание на вершине большого блога( 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 изменение.
как работает:
- создайте tt, добавьте имя сборки= " $ (SolutionDir)path\to\other\project\output\foo.dll и настроить преобразование и результат, как ожидалось
удалите ссылки на сборку из .tt
внутри файла proj используйте этот код для настройки преобразования при сборке:
<PropertyGroup> <!-- Initial default value --> <_TransformExe>$(CommonProgramFiles)\Microsoft Shared\TextTemplating.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.0\TextTransform.exe</_TransformExe> <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating.0\TextTransform.exe</_TransformExe> <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating.0\TextTransform.exe</_TransformExe> <!-- Future proof 'til VS2013+2 --> <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating.0\TextTransform.exe</_TransformExe> <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating.0\TextTransform.exe</_TransformExe> <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating.0\TextTransform.exe</_TransformExe> <IncludeForTransform>@(DllsToInclude, '&quot; -r &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=""$(_TransformExe)" "@(_TextTransform)" -r "$(IncludeForTransform)"" 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"в единственное, что осталось сделать, это добавить пути к 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
Comments