Мне очень трудно использовать t4-шаблоны с нестандартной структурой каталогов. Я использую ссылки внутри моего файла csproj, который, похоже, лежит в основе проблемы.Пользовательский путь выходного файла для шаблона T4
У меня есть работа, однако VS автоматически вносит изменения, которые ломают вещи.
Я иметь следующую структуру каталогов:
/source
+ MyLib.cs
/generate
/MyLib
+ MyLib.tt
+ MyLib.A.t4 // included by MyLib.tt
+ MyLib.B.t4 // included by MyLib.tt
+ MyLib.C.t4 // included by MyLib.tt
/build_examples
/vs
+ MyLib.csproj
+ MyLib.sln
MyLib.csproj выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
...
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<None Include="..\..\generate\MyLib\MyLib.tt">
<Link>MyLib\MyLib.tt</Link>
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>..\..\source\MyLib.cs</LastGenOutput>
</None>
<None Include="..\..\generate\MyLib\MyLib.A.t4">
<Link>MyLib\MyLib.A.t4</Link></None>
<None Include="..\..\generate\MyLib\MyLib.B.t4">
<Link>MyLib\MyLib.A.t4</Link></None>
<None Include="..\..\generate\MyLib\MyLib.C.t4">
<Link>MyLib\MyLib.A.t4</Link></None>
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\source\MyLib.cs">
<Link>MyLib\MyLib.cs</Link>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>MyLib.tt</DependentUpon>
</Compile>
</ItemGroup>
</Project>
Так что мой проект имеет ссылку на шаблон t4, и я хочу, чтобы t4 шаблон для создания выходного файла, вне проекта, с которым проект связан и компилируется.
Что у меня выше работает. Настройте такой проект, откройте его, и VS правильно подключится и вложит в файл LINKED tt и файл cs. Теперь перестроим. Все работает. Двигатель t4 правильно перестраивает файл, который существует вне каталога проекта.
Но попробуйте еще раз, и BOOM!
После выполнения сборки, VS автоматически удаляет следующую строку из файла .csproj:
<LastGenOutput>..\..\source\MyLib.cs</LastGenOutput>
Я не знаю, почему он это делает, и после того, как линия исчезает, когда перестроения срабатывает, вместо изменения t4 двигателя:
/source/MyLib.cs
он решает, что он должен автоматически генерирует новый выход из файла Tt и он создает:
/generate/MyLib/MyLib1.cs
Любая помощь будет оценена по достоинству.
Приветствия
Возможно, вы захотите проверить T4ToolBox. Он делает это, и вы можете видеть, как смотреть исходный код. –
Возможно, это невозможно из-за правил кодирования или личного вкуса, но я вижу T4 в качестве исходного кода и, таким образом, поместил бы файл tt в папку/source. Я лично префикс сгенерированных файлов, чтобы они были легко идентифицируемы. – FuleSnabel
Рассмотрите возможность использования [Runtime T4] (http://msdn.microsoft.com/en-us/library/ee844259.aspx) и избавите себя от головной боли с проблемами справки и пути. Конечно, это другой способ использования T4. –