我如何获得一个T4的模板,以产生其产出在每个建设?因为它是现在,它只能再生,当我做出改变的模板。

我已经发现的其他问题,类似这样的:

T4的转变,并建立了在Visual Studio (没有答案)

如何获得t4的文件建立在visual studio? (答案是不足够详细,[同时仍然被很多复杂的]以及甚至不作总的感觉)

那里已经有了一个更简单的方式做到这一点!

有帮助吗?

解决方案

我用 JoelFan 的答案来提出这个问题。我更喜欢它,因为每次向项目添加新的 .tt 文件时,您不必记住修改预构建事件。

  • 将 TextTransform.exe 添加到您的 %PATH%
  • 创建了一个名为transform_all.bat的批处理文件(见下文)
  • 创建一个预构建事件“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

其他提示

我同意 GarethJ 的观点 - 在 VS2010 中,在每次构建时重新生成 tt 模板要容易得多。Oleg Sych 的博客描述了如何做到这一点。简而言之:

  1. 安装 视觉工作室 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" />

那是一个伟大的NuGet,不只是这样的:

PM> Install-Package Clarius.TransformOnBuild

有关的详细信息包可以是 在这里找到

我用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扩展您.TT文件(即MyTemplate.tt)的文件名。这将有扩大建设项目之前产生MyTemplate.cs模板的结果。然后实际的构建将编译MyTemplate.cs

最近发现这大VS插件,

它不仅生成您的构建T4,但它允许基于T4的方法来的JavaScript,CSS的缩小,甚至可以让你使用更少的语法你的CSS!

可能的最简单的方法是安装一个Visual Studio扩展称为 AutoT4

它运行在构建所有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 的路径可能需要一些调整。上面的路径是VS 2008年安装了它在我的机器上;但你可能会发现,TextTemplatingTextTransform.exe之间的版本号是不同的。

检查出 C:\ Program Files文件(x86)的\ Common Files文件\ Microsoft共享\ TextTemplating 存在有一个命令行变换的exe。或者写一个自定义主机MSBuild任务,做好改变自己。

扩展于 塞斯·雷诺乔尔范的 答案,我想出了这个。使用此解决方案,每次向项目添加新的 .tt 文件时,无需记住修改预构建事件。

实施程序

  • 创建一个名为transform_all.bat的批处理文件(见下文)
  • 创建预构建事件 transform_all.bat "$(ProjectDir)" $(ProjectExt) 对于您想要构建的带有 .tt 的每个项目

全部变换.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 文件必须位于项目目录中,否则它们将无法构建。您可以通过指定不同的路径作为第一个参数(IE。 代替 "$(ProjectDir)" 包含 TT 文件的路径。)

  3. 还要记住设置正确的路径 transform_all.bat 批处理文件。
    例如,我将其放置在我的解决方案目录中,因此预构建事件如下 "$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)

如果你使用Visual Studio 2010中,你可以使用Visual Studio建模与可视化SDK: http://code.msdn.microsoft.com/vsvmsdk

这包含用于在构建时执行T4模板MSBuild任务。

看一看奥列格的博客更多的解释: 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文件将被automaticaly转化。

下面是我的解决方案 - 类似于接受的答案。 我们有我们的源代码控制的问题。目标的.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)"

您只需要这个命令添加到项目的预生成事件:

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个链接:()我想出了这个 .targets 与 Visual Studio Proj 文件一起使用的文件。

当您在 .tt 中使用其他 dll-s 并且您希望结果随着 dll-s 的变化而变化时,它非常有用。

怎么运行的:

  1. 创建 tt,添加程序集 name="$(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-s 时生成代码。

您可以删除自定义工具(从 Visual Studio 内部的属性中),这样 VS 就不会每次都尝试进行转换并惨遭失败。因为我们在步骤 2 中删除了程序集引用

T4Executer 实现这个要求VS2019。您可以指定模板忽略打造,并有后生成选项执行。

一些家伙 建立了一个 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