Путь к пользовательскому выходному файлу для шаблона T4

Мне действительно трудно использовать шаблоны t4 с нестандартной структурой каталогов. Я использую ссылки внутри моего файла csproj, который, кажется, является корнем проблемы.

У меня это работает, однако, 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 правильно перестраивает файл, который существует за пределами каталога проекта.

Но попробуйте еще раз, и БУМ!

После сборки VS автоматически удаляет следующую строку из файла.csproj:

      <LastGenOutput>..\..\source\MyLib.cs</LastGenOutput>

Я не уверен, почему это происходит, и как только линия исчезает, когда запускается перестройка, вместо смены движка t4:

/source/MyLib.cs

Он решает, что ему нужно автоматически сгенерировать новый вывод из файла tt, и он создает:

/generate/MyLib/MyLib1.cs

Любая помощь будет оценена.

ура

1 ответ

Попробуйте добавить OutputFilePath в ваш файл проекта:

<None Include="..\..\generate\MyLib\MyLib.tt">
  <Link>MyLib\MyLib.tt</Link>
  <Generator>TextTemplatingFileGenerator</Generator>
  <OutputFilePath>..\..\source\</OutputFilePath>
  <LastGenOutput>..\..\source\MyLib.cs</LastGenOutput>
</None>

См. http://msdn.microsoft.com/en-us/library/ee847423.aspx для получения подробной информации о запуске T4 в процессе сборки.

Другие вопросы по тегам