T4模板自定义输出文件路径

4

我发现在非标准目录结构下使用t4模板确实很困难。我在csproj文件中使用链接,这似乎是问题的根源。

尽管我让它工作了,但VS会自动进行更改,从而破坏事情的进展。

我的目录结构如下:

/source
  + MyLib.cs 
/generate
    /MyLib
      + MyLib.tt
      + MyLib.A.t4 // included by MyLib.tt
      + MyLib.B.t4 // included by MyLib.tt
  + MyLib.C.t4 // included by MyLib.tt
/build_examples
   /vs
     + MyLib.csproj
     + MyLib.sln

我的 MyLib.csproj 文件看起来是这样的:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    ...
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
  </ItemGroup>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <ItemGroup>
    <None Include="..\..\generate\MyLib\MyLib.tt">
      <Link>MyLib\MyLib.tt</Link>
      <Generator>TextTemplatingFileGenerator</Generator>
      <LastGenOutput>..\..\source\MyLib.cs</LastGenOutput>
    </None>
    <None Include="..\..\generate\MyLib\MyLib.A.t4">
      <Link>MyLib\MyLib.A.t4</Link></None>
    <None Include="..\..\generate\MyLib\MyLib.B.t4">
      <Link>MyLib\MyLib.A.t4</Link></None>
    <None Include="..\..\generate\MyLib\MyLib.C.t4">
      <Link>MyLib\MyLib.A.t4</Link></None>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="..\..\source\MyLib.cs">
      <Link>MyLib\MyLib.cs</Link>
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>MyLib.tt</DependentUpon>
    </Compile>
  </ItemGroup>
</Project>

所以我的项目有一个链接到t4模板的链接,我希望该t4模板生成一个输出文件,位于项目之外,该项目将链接并编译该输出文件。上述内容是有效的。建立这样的项目,打开它,并且VS会正确地链接和嵌套*链接的tt文件和cs文件。现在重建。一切正常。t4引擎正确地重建了存在于项目目录之外的文件。
但再试一次,然后BOOM!在构建后,VS会自动从.csproj文件中删除以下行:
      <LastGenOutput>..\..\source\MyLib.cs</LastGenOutput>

我不确定为什么会这样做,一旦重新构建被触发时,该行消失,而不是t4引擎进行更改:

/source/MyLib.cs

它决定从tt文件自动生成新的输出,并创建:
/generate/MyLib/MyLib1.cs

任何帮助都将不胜感激。
谢谢。

您可能想要检查T4Toolbox。它可以做到这一点,并且您可以通过查看源代码了解其如何实现。 - Federico Berasategui
1
可能由于编码准则或个人喜好而不可行,但我将T4视为源代码,因此将tt文件放在/source文件夹中。我个人会为生成的文件添加前缀,以便轻松识别。 - Just another metaprogrammer
考虑使用Runtime T4,可以避免参考和路径问题,从而节省大量麻烦。当然,这是一种不同的使用T4的方式。 - Phillip Scott Givens
1个回答

4
尝试将OutputFilePath添加到您的项目文件中:
<None Include="..\..\generate\MyLib\MyLib.tt">
  <Link>MyLib\MyLib.tt</Link>
  <Generator>TextTemplatingFileGenerator</Generator>
  <OutputFilePath>..\..\source\</OutputFilePath>
  <LastGenOutput>..\..\source\MyLib.cs</LastGenOutput>
</None>

请参考http://msdn.microsoft.com/en-us/library/ee847423.aspx,了解如何在构建过程中运行T4的详细信息。

尝试将文件夹放置在项目文件夹的子文件夹中,此时.tt文件从解决方案资源管理器中消失。 - Peter Nimmo
同时,它根本不起作用,该文件是根据“无包含路径”生成的,OutputFilePath 没有影响,当您运行工具时,Visual Studio 会在下面添加一个新的“内容链接”变体,并且文件链接与我们自己为“无包含”编写的链接相同。 - Peter Nimmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接