[英]Using project references as assembly paths in T4
我有一個.tt腳本需要引用幾個外部程序集。
T4主機是否可以自動包含項目中引用的程序集 - 而不是手動為每個程序集添加程序集指令?
例如,當使用相對於$(ProjecDir)
的路徑時,從nuget引用程序集是一個移動目標。
使用像$(Project)\\bin\\Debug\\Example.dll
這樣的程序集路徑似乎也不是最優的 - 因為它要求構建以前已成功 - 如果你有一個.tt文件生成“ ErrorGeneratingOutput
”,情況可能就不是這樣了“在.cs文件中!?
更新1:
所以我對此進行了第二次嘗試,但這次嘗試解決圍繞“TransformOnBuild”的問題(作為旁注,我強烈推薦@ kzu的優秀項目: https : //github.com/clariuslabs/TransformOnBuild )而沒有$(SolutionDir)在沒有直接從msbuild運行TextTransform時可用。 無論如何 - 我想出了一個兩步解決方案。
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
如果可以的話,我會發表評論。
對於這個問題:不可能自動包含項目中引用的程序集,但是您可以限制您必須完成的工作。
如果您在建議編號1中看到以下鏈接,則可以在t4讀取之前使用c#定義匯編代碼。 這使得可以讀取帶有反射的目錄並在那里加載每個組件。那么問題是你的程序集在哪里?
List<Assembly> allAssemblies = new List<Assembly>();
string path = Assembly.GetExecutingAssembly().Location;
foreach (string dll in Directory.GetFiles(path, "*.dll"))
allAssemblies.Add(Assembly.LoadFile(dll));
<#@ assembly name=dll #>
這是未經測試但應該讓你開始,以免。 供參考 - > 如何從/ bin目錄中加載所有程序集
第二部分:
$(SolutionDir)
但這與$(Project)相同,除了一個級別更低。 - > 如何在T4文本模板中使用自定義庫/項目? 編輯:這是一個有效的動態包含。 只需在任何其他.tt文件中引用由此生成的.ttinclude的結果
我用調試器測試它似乎工作。
並將程序集本地化更改為您需要的位置。
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Net.Http" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".ttinclude" #><#
List<Assembly> allAssemblies = new List<Assembly>();
string file = Assembly.GetExecutingAssembly().Location;
if(file!= "")
{
string path = Path.GetDirectoryName(file).TrimEnd();
if(path != "")
foreach (string dll in Directory.GetFiles(path, "*.dll"))
{
if(dll != "")
{
allAssemblies.Add(Assembly.LoadFile(dll));
#>\<#<#= "@ assembly name=\""+ dll +"\" "#>\#><#="\n"#><#
}
}
}
#>
輸出:
<#@ assembly name="C:\TEMP\3mo0m0mq.dll" #>
<#@ assembly name="C:\TEMP\4ybsqre3.dll" #>
<#@ assembly name="C:\TEMP\ao0bzedf.dll" #>
<#@ assembly name="C:\TEMP\bo2w102t.dll" #>
<#@ assembly name="C:\TEMP\c5o2syvv.dll" #>
<#@ assembly name="C:\TEMP\dz1fin10.dll" #>
<#@ assembly name="C:\TEMP\giym0gef.dll" #>
<#@ assembly name="C:\TEMP\hjfgqkov.dll" #>
<#@ assembly name="C:\TEMP\ibuz4wvb.dll" #>
<#@ assembly name="C:\TEMP\ilrcwa2y.dll" #>
<#@ assembly name="C:\TEMP\k0yeumhb.dll" #>
<#@ assembly name="C:\TEMP\kirzdsqp.dll" #>
<#@ assembly name="C:\TEMP\ksxl4f2z.dll" #>
<#@ assembly name="C:\TEMP\l4kja4ts.dll" #>
<#@ assembly name="C:\TEMP\ljgxkpo0.dll" #>
<#@ assembly name="C:\TEMP\lkvkmlct.dll" #>
<#@ assembly name="C:\TEMP\lnofhhlq.dll" #>
<#@ assembly name="C:\TEMP\nbqhmjqd.dll" #>
<#@ assembly name="C:\TEMP\oc3pxhmq.dll" #>
<#@ assembly name="C:\TEMP\qb43ntcu.dll" #>
<#@ assembly name="C:\TEMP\qlyoyhyr.dll" #>
<#@ assembly name="C:\TEMP\snwvtb00.dll" #>
<#@ assembly name="C:\TEMP\umhhb2wb.dll" #>
<#@ assembly name="C:\TEMP\xsyfel0b.dll" #>
<#@ assembly name="C:\TEMP\z1weyhko.dll" #>
你可以用<\\#轉義<#字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.