【问题标题】:Custom Output File Path For T4 TemplateT4 模板的自定义输出文件路径
【发布时间】:2014-10-03 23:53:20
【问题描述】:

我发现使用具有非标准目录结构的 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正确链接并嵌套LINKED tt文件和cs文件。现在重建。都在工作。 t4 引擎会正确重建项目目录之外存在的文件。

但再试一次,然后 BOOM!

构建完成后,VS 会自动从 .csproj 文件中删除以下行:

      <LastGenOutput>..\..\source\MyLib.cs</LastGenOutput>

我不知道为什么会这样,一旦触发重建时线路消失,而不是改变 t4 引擎:

/source/MyLib.cs

它决定它需要从 tt 文件自动生成一个新的输出并创建:

/generate/MyLib/MyLib1.cs

任何帮助将不胜感激。

干杯

【问题讨论】:

  • 您可能需要检查 T4ToolBox。它是这样做的,你可以通过查看源代码来了解它。
  • 可能由于编码指南或个人喜好而无法实现,但我将 T4 视为源代码,因此会将 tt 文件放在 /source 文件夹中。我个人为生成的文件添加前缀,以便于识别。
  • 考虑使用Runtime T4 并为自己省去很多关于引用和路径问题的麻烦。当然,这是使用 T4 的另一种方式。

标签: c# visual-studio-2010 t4 texttemplate


【解决方案1】:

尝试将 OutputFilePath 添加到您的项目文件中:

<None Include="..\..\generate\MyLib\MyLib.tt">
  <Link>MyLib\MyLib.tt</Link>
  <Generator>TextTemplatingFileGenerator</Generator>
  <OutputFilePath>..\..\source\</OutputFilePath>
  <LastGenOutput>..\..\source\MyLib.cs</LastGenOutput>
</None>

有关在构建过程中运行 T4 的详细信息,请参阅 http://msdn.microsoft.com/en-us/library/ee847423.aspx。

【讨论】:

  • 尝试任何变化,如果文件夹位于项目文件夹的子文件夹中,并且 .tt 文件从解决方案资源管理器中消失
  • 另外就是根本不起作用,文件是根据None Include路径生成的,OutputFilePath没有影响,而且在你运行工具的那一刻Visual Studio添加了一个新的“内容链接” " 下面的变体和文件链接与我们自己为“None Include”编写的文件链接相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多