获取Visual Studio在每个版本上运行T4模板


163

如何获得T4模板以在每次构建时生成其输出?现在,它仅在我对模板进行更改时才重新生成。

我发现了其他与此类似的问题:

Visual Studio中的T4转换和构建顺序(未回答)

如何在Visual Studio中构建t4文件?(答案不够详细(尽管仍然很复杂),甚至完全没有意义)

必须有一个更简单的方法来做到这一点!


虽然我个人非常有兴趣听到对此的答案,但是您的特殊情况是什么?通常,模板的输出应仅是输入的函数,因此可以很好地进行更改。
帕维尔·米纳夫

6
我的模板使用反射来检查其他组件,这些组件自上次构建以来可能已更改。
JoelFan


我的模板有一个用途,记录构建日期时间。
Scott Solmer

Answers:


68

我用JoelFan的答案来提出这个问题。我更喜欢它,因为您不必记住每次将新的.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
不错的解决方案。我更喜欢"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe"在批处理文件中放入TextTransform.exe()的完整路径,而不是将其添加到%PATH%
Adam Nofsinger

20
更好的变量是%COMMONPROGRAMFILES(x86)%而不是%COMMONPROGRAMFILES%,因为它也可以在64位系统上工作。
Durden81 2012年

3
因此,完整的路径将是%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe。将其用双引号引起来。
诺森本

1
@ piers7:我更新了代码以自动检测正在运行脚本的OS的“位”。我还包括了northben的注释,以跳过obj目录,并实现了Adam Nofsinger的不修改%PATH%环境变量的首选项。
Alex Essilfie 2013年

1
恕我直言,必须提供TextTransform.exe吸吮的道路。您已经可以在Visual Studio中右键单击“运行自定义工具”,因此它已经具有该工具的路径。从Visual Studio上下文进行构建时,为什么必须重新进行一次提供工作?
耶斯(Jez)

70

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

  1. 安装Visual Studio 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" />


4
这是一个非常好的解决方案。但是,是否有一种方法可以使此方法工作而无需安装SDK?我一直在尝试通过复制.targets文件和相关程序集使其正常工作,但是没有成功。
grimus

3
Chirpy似乎不需要下载任何SDK即可工作...但是,您仍然必须下载并配置Chirpy。我仍在尝试寻找一种适用于VS2010默认安装的解决方案,该解决方案可通过源存储库使用,以便开发人员仅需签出该存储库即可正常工作。所有这些其他解决方案都需要开发人员过多注意。
Mir

1
如果您使用x64版本的MSBuild构建项目,则会收到以下错误消息:'MSB4019:导入的项目“ C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating.targets “ 没找到。' 错误。解决方法-在项目文件中用$(MSBuildExtensionsPath32)替换$(MSBuildExtensionsPath)变量。
2012年

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
Giulio Vian

29

有一个很棒的NuGet软件包可以做到这一点:

PM> Install-Package Clarius.TransformOnBuild

有关该软件包的详细信息,请参见此处


2
有一个“非官方”分支:nuget.org/packages/Clarius.TransformOnBuild-非官方支持content构建操作
Erno

1
这是一个很好的扩展,但是它在命令行模式下运行TextTransform.exe,因此hostspecific =“ true”函数将无法工作
Gh61 '17

1
@JenishRabadiya将此行添加到模板的顶部:<#@ template language="C#" #>
Peter van Kekem

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模板的项目的“项目属性”。进入构建事件并添加以下预构建事件命令行

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

用您的.tt文件(即MyTemplate.tt)的文件名(不带.tt扩展名)替换MyTemplate。这将导致在构建项目之前将模板扩展为生成MyTemplate.cs。然后实际构建将编译MyTemplate.cs



1
不要忘记$(SolutionDir).. \ .. \ tools \ RunTemplate.bat周围的引号
Ewald Hofman 2010年

14

最近发现了这个很棒的VS插件Chirpy

它不仅会在构建中生成T4,而且允许使用基于T4的方法来最小化javascript,CSS,甚至允许您为CSS使用LESS语法!


13

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

它自动运行所有T4模板。


同意!可配置,并且与VS 2015一起使用。它甚至支持EnvDTE程序集的使用(用于获取构建配置),并非所有方法都可以。唯一的缺点是所有团队成员都必须安装扩展。
Gyromite

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"

当然,您可以将其提取到批处理文件中,如果需要,可以将项目目录路径传递到该文件中。

注意:该路径可能需要进行一些调整。上面的路径是VS 2008在我的计算机上安装它的位置;但是您可能会发现TextTemplating和之间的版本号TextTransform.exe不同。


@SprintStar,如果您使用VS 2012,则可能有更好的方法。其他答案谈论更好的方式已经存在了2010年VS
彼得·泰勒

这是最好的方法,因为我不必安装任何东西。
瑞恩·盖茨

1
看到没有1.2,但有一个12.0,因此将其更改为该错误,但收到此错误:System.Exception: T4MVC can only execute through the Visual Studio host
colmde

1
只需将文件夹路径更新为使用14.0而不是1.2即可。
pistol-pete'9

在我看来,这是最好的解决方案(如上所述只是更改了14.0)
Nelson Rodriguez

9

签出C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ TextTemplating那里有一个命令行转换exe。或者,使用自定义主机编写MSBuild任务,然后自己进行转换。


1
哦,尽管您可以在2010年执行“ devenv / Command TextTransformation.TransformAllTemplates / Command File.Exit MySolution.sln”之类的操作,但它有时会在构建服务器上中断。最好的选择是使用自定义主机编写MSBuild任务。
MarkGr

对于桌面版本,只需创建一个执行TransformAllTemplates的宏,然后创建一个。
MarkGr

7

扩展Seth RenoJoelFan的答案时,我了这个。使用此解决方案,无需在每次向项目中添加新的.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目前无法预料”。在我的输出中。它恰好发生在这一行:对于(t4list.txt)中的/ f“ delims =” %% d“,执行...知道我缺少什么吗?
迈克尔·刘易斯

@MichaelLewis:我已经多次浏览了批处理文件,却没有发现可能导致错误的原因。请尝试Seth Reno提出的方法,看看是否会产生相同的错误。同时,您能否将t4list.txt文件发布到PasteBin,以便我尝试查看您的错误是否来自那里?
Alex Essilfie '16

我以相同的问题尝试了Seth的方法(“ \ Common目前无法预料”)。由于公司的限制,我无法发布t4list.txt文件,但是该文件只有一行,并且\ Common不会出现在路径中。
迈克尔·刘易斯

@MichaelLewis:不幸的是,如果您在发生错误for /f "delims=" %%d in (t4list.txt) do (并且公司限制阻止您发布t4list.txt文件,那么恐怕我无能为力。我本来想帮助解决此问题,但由于没有数据可处理,因此这似乎是不可能的。希望您能解决此问题,如果成功,请记得发布解决方案。
Alex Essilfie'2

tt包含时是否可以这样做(this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;?不幸的是,当我不是从Visual Studio内部运行tt时,会得到null引用异常
安德烈·K


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:\ Users \ Documents \ Visual Studio 2012 \ Addins \

而你走了。

如果要在VS2012中使用它,则需要修改Dynamo.AutoTT.AddIn文件,并将AddIn文件中的Version设置为11.0。


3

感谢GitHub.com/Mono/T4,目前,您可以通过将它添加到.csproj文件中来进行.NET Core和Visual Studio构建:

  <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" />,以便即使尚未生成文件也可以编译这些文件。

RemoveInclude技巧仅用于首次生成,或者您可以使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失败。这是在temp文件夹中运行T4,比较目标文件并仅在有相同更改的情况下将其复制的代码。它不能解决只读文件的问题,但至少不会经常发生:

变形蝙蝠

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构建服务器上进行构建时,对configuration = debug的检查可确保您不会在发布模式下重新生成代码。


很好,但是如果T4MVC不仅在项目中成为tt,而且我们也不希望全部运行,则进行全部转换可能很危险……
Landeeyo 2014年

3
我在v11.0文件夹中没有TextTemplating。你从哪里得到的?
Zack 2015年

1

在Visual Studio 2013中,右键单击T4模板,然后将“构建时转换”属性设置为true。


1
我无法在右键单击菜单上找到此选项,但是根据MSDN,可以通过在VS 2012和2013中编辑项目文件来实现,请参阅msdn.microsoft.com/zh-cn/library/ee847423。 aspxmsdn.microsoft.com/en-us/library/vstudio/ee847423.aspx了解详细信息
yoel halb

这似乎是仅有形T4工具随附的选项,而在Visual Studio中不是默认选项。
马特·迪特罗里奥

是的,这仅在T4工具箱的专业版中。
Pompair

1

这就是我的解决方法。链接。基本上建立在一个很棒的博客上(blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/不能发布超过2个链接:()我想出了.targets文件,用于Visual Studio项目文件。

当您在.tt中使用其他dll且您希望结果随dll的变化而变化时,此功能很有用。

这个怎么运作:

  1. 创建tt,添加程序集名称=“ $(SolutionDir)path \到\ 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执行此操作。您可以指定在构建时忽略的模板,并且有一个“构建后执行”选项。


1

您只需安装NuGet软件包:Clarius.TransformOnBuild

然后,每次您单击“ 重建项目”(或“解决方案”)时,.tt文件都会运行


1

在Visual Studio 2017中(可能也是下一版本),应在Pre-build事件中添加此内容:

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

ps如果模板不在根项目目录中,请更改其路径。


0

人造了一个nuget包为此。

旁注:我同时从TextTemplate.exe和该程序包(因为该程序包调用TextTemplate.exe)获得编译错误,但没有从Visual Studio中获得编译错误。因此,显然行为是不一样的。小心。

编辑:最终是我的问题。


0

这是仅使用Microsoft工具和标准路径的预构建事件。已在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还提供了一个指南,可通过使用项目文件中的T4ParameterValues在模板中使诸如“ $(SolutionDirectory)”之类的宏可用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.