我有一个需要引用几个外部程序集的.tt脚本。在T4中使用项目引用作为程序集路径
T4主机是否可以自动包含项目中引用的程序集 - 而不是手动为每个程序集添加一个程序集指令?
E.g.当使用相对于$(ProjecDir)
的路径时,从nuget引用装配体是移动目标。
使用像$(Project)\bin\Debug\Example.dll
这样的程序集路径似乎也不是最佳 - 因为它需要以前的构建已经成功 - 如果在.cs文件中生成“ErrorGeneratingOutput
”的.tt文件,则可能不是这种情况! ?
更新1:
所以我有第二刺在这一点,但这个时间,试图围绕解决这个问题“TransformOnBuild”(作为一个侧面说明,我可以强烈推荐@ kzu的优秀项目:https://github.com/clariuslabs/TransformOnBuild)而没有通过直接从msbuild运行TextTransform时没有$(SolutionDir)可用。无论如何 - 我想出了一个2步骤的解决方案。
的MSBuild目标使用WriteLinesToFile任务生成基于在的csproj文件中找到的引用装配指令的新鲜列表.TT文件。
项目中的任何其他.tt文件都可以包含自动生成的文件以获取项目程序集注册。
这里是目标的一个示例:
<Target Name="Write_AssemblyRefs_TT" BeforeTargets="TransformOnBuild">
<!-- A message for all to enjoy! -->
<WriteLinesToFile File="@(MyTextFile)"
Lines="<# /* AUTOGENERATED BY MSBUILD and Kern Herskind Nightingale */ #>"
Overwrite="true"
Encoding="Unicode" />
<!-- Output all assembly references with a HintPath -->
<WriteLinesToFile File="@(MyTextFile)"
Lines="<#@ assembly name="$(ProjectDir)%(Reference.HintPath)" #>"
Overwrite="false"
Encoding="Unicode"
Condition="'%(Reference.HintPath)' != ''" />
<!-- Output all project references - this could fail with custom nameing/build output dirs -->
<WriteLinesToFile File="@(MyTextFile)"
Lines="<#@ assembly name="$(ProjectDir)%(ProjectReference.RelativeDir)bin\$(Configuration)\%(ProjectReference.Name).dll" #>"
Overwrite="false"
Encoding="Unicode" />
</Target>
<ItemGroup>
<MyTextFile Include="AssemblyRefs.tt" />
</ItemGroup>
而如何将其包含在T4文件(简单):
<#@ include file="AssemblyRefs.tt" #>
代码生成的代码发生器:)
更新2:
我创建了一个NuGet包,使其方便地添加上述集指令生成构建目标:https://www.nuget.org/packages/AssemblyReferencesTT/1.0.12
想知道这里所描述的$(LIBDIR)技术可能是解决方案的一部分:HTTP ://blogs.msdn.com/b/t4/archive/2013/08/29/what-s-new-in-t4-for-visual-studio-2013.aspx – herskinduk 2014-10-06 08:45:23
herskinduk,我找不到方法要做到这一点,但是不可能用正确的路径生成另一个tt文件,然后构建th是生成tt文件? – samy 2014-10-07 14:36:14
@samy我会认为这是可能的。基本上,这源于需要通过nuget发布.tt文件。如果我可以使用Nuget来管理依赖关系,这将会是超级光滑 - 这需要T4能够加载项目引用。也许MEF是答案? – herskinduk 2014-10-07 21:21:03