【发布时间】:2014-09-23 08:14:24
【问题描述】:
我有一个需要引用几个外部程序集的 .tt 脚本。
T4 主机是否可以自动包含项目中引用的程序集 - 而不是我手动为每个程序添加一个程序集指令?
例如当使用相对于$(ProjecDir) 的路径时,从 nuget 引用程序集是一个移动目标。
使用像$(Project)\bin\Debug\Example.dll 这样的程序集路径似乎也不是最优的——因为它需要之前已经成功构建——如果你有一个.tt 文件在. cs文件!?
更新 1:
所以我对此进行了第二次尝试,但这次尝试解决围绕“TransformOnBuild”的问题(作为旁注,我强烈推荐@kzu 的优秀项目:https://github.com/clariuslabs/TransformOnBuild)并且没有可用的 $(SolutionDir)当不通过直接从 msbuild 运行 TextTransform 时。无论如何 - 我想出了一个两步解决方案。
msbuild 目标使用 WriteLinesToFile 任务生成一个 .tt 文件,其中包含基于在 csproj 文件中找到的引用的新汇编指令列表。
项目中的任何其他 .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) 技术是否可以成为解决方案的一部分:blogs.msdn.com/b/t4/archive/2013/08/29/…
-
herskinduk,我找不到办法,但是不能用正确的路径生成另一个 tt 文件,然后构建这个生成的 tt 文件吗?
-
@samy 我认为这是可能的。基本上,这源于需要通过 nuget 分发 .tt 文件。如果我可以只使用 Nuget 来管理依赖项,那将是非常巧妙的——但这需要 T4 能够加载项目引用。也许 MEF 就是答案?
-
这是我目前所拥有的github.com/herskinduk/AutoWrapping/blob/…(见第 105 行)。我仍然有两个丑陋的程序集指令,但其余程序集动态加载并通过 MEF 注入。
-
我一直在考虑创建一个可以促进这一点的自定义主机。好/坏主意?
标签: c# .net .net-assembly t4 auto-generate