2014-01-25 2 views
2

Мне очень трудно использовать 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 

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

Приветствия

+0

Возможно, вы захотите проверить T4ToolBox. Он делает это, и вы можете видеть, как смотреть исходный код. –

+1

Возможно, это невозможно из-за правил кодирования или личного вкуса, но я вижу T4 в качестве исходного кода и, таким образом, поместил бы файл tt в папку/source. Я лично префикс сгенерированных файлов, чтобы они были легко идентифицируемы. – FuleSnabel

+0

Рассмотрите возможность использования [Runtime T4] (http://msdn.microsoft.com/en-us/library/ee844259.aspx) и избавите себя от головной боли с проблемами справки и пути. Конечно, это другой способ использования T4. –

ответ

3

Попробуйте добавить 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 для хороших деталей работы Т4 в процессе сборки.