У меня есть .tt script, который должен ссылаться на пару внешних сборок.
Возможно ли, чтобы хост T4 автоматически включал сборки, указанные в проекте, вместо того, чтобы вручную добавлять директиву сборки для каждого из них?
например. Ссылка на сборку из nuget является движущейся мишенью при использовании пути относительно $(ProjecDir)
.
Использование путей сборки, таких как $(Project)\bin\Debug\Example.dll
, также кажется менее оптимальным - поскольку это требует, чтобы сборка была успешной ранее - это, вероятно, не так, если у вас есть файл .tt, генерирующий "ErrorGeneratingOutput
" в a. cs file!?
Обновление 1:
Итак, у меня был второй удар, но на этот раз, пытаясь решить проблему вокруг "TransformOnBuild" (в качестве побочной заметки я могу очень рекомендовать @kzu отличный проект: https://github.com/clariuslabs/TransformOnBuild) и не имея $(SolutionDir), доступного, если не запущен TextTransform через direct from msbuild. Во всяком случае - я придумал двухэтапное решение.
-
Цель 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