我发现在非标准目录结构下使用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
任何帮助都将不胜感激。
谢谢。