我有一個需要引用幾個外部程序集的.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