2011-10-25 17 views
17

Napotkano na mały problem z generowaniem mojego kodu T4.Jak wyłączyć #line dyrektywy zapisywane w pliku wyjściowym generowania T4

Złamałem szablony T4 w oddzielne pliki i umieściłem je w różnych katalogach, zrobiłem to, aby części mojego generowania kodu mogły być ponownie użyte w wielu projektach, np. Generowanie modelu, generowanie repozytorium i generowanie usługi zawierają podstawowy plik EntityGeneration.tt.

Niestety, gdy TextTemplating rozwiązuje moje zagnieżdżone załączniki, buduje długą dyrektywę wstępnego procesora #line w wygenerowanym pliku .cs, łącząc wszystkie ścieżki względne z plikiem zawartym na najniższym poziomie.

Niestety, ponieważ ta ścieżka jest zbudowana ze względnych ścieżek, kończy się niepotrzebnie długo, tak długo, że przekracza maksymalną długość ścieżki (Windows 7).

Oto linia winy z wygenerowanego kodu w przypadku jesteś zainteresowany:

#line 3 "C:\VS2010\AlbatrossTravelGroup\ASC\AlbatrossTravelGroup.ASC.BusinessRules\Services\Contracts\..\..\..\..\AlbatrossTravelGroup.BusinessRules\Services\Contracts\..\..\..\AlbatrossTravelGroup.Models\Repositories\Contracts\..\..\../AlbatrossTravelGroup.Common/CodeGeneration.tt" 

Moje pytanie brzmi, jak mogę wyłączyć dyrektywy te są zapisywane w pliku wygenerowanego kodu? W przeciwnym razie, jak mogę uniknąć tego problemu bez zmiany mojej struktury plików?

+2

Obecnie jako rozwiązanie tymczasowe utworzyłem folder "CodeGeneration", który tworzy dowiązania symboliczne w tym folderze do każdego z moich plików T4, które należy uwzględnić.Następnie zamiast każdego dołączonego pliku T4 zawierającego inne pliki T4 poprzez ścieżkę względną, używają one tylko nazwy pliku. Następnie w miejscu docelowym, w którym chcę używać szablonów T4, używam ścieżki względnej do katalogu "CodeGeneration". Powoduje to znacznie krótszą długość ścieżki, ponieważ używa o wiele mniej względnych ścieżek. Jeśli ktoś chce pełnego wyjaśnienia, zamieści odpowiedź na żądanie :) – Lukazoid

+1

Moje tymczasowe rozwiązanie powyżej się zepsuło, nie mam pojęcia, dlaczego studio graficzne po prostu zaczęło nie rozwiązywać plików. Wreszcie muszę użyć rejestru, aby określić dodatkowe tt obejmują katalogi, mniej niż idealne, ale wydaje się, że jedyną rzeczą, która działa. – Lukazoid

+0

Możesz spróbować czegoś takiego jak przedstawione rozwiązanie makro VS [tutaj] (http://stackoverflow.com/questions/3506525/t4-preprocessed-template-debugging-n-working-visual-studio-2010-rtm/7505247#7505247). – BitMask777

Odpowiedz

0

Nie jestem pewien, czy to rozwiąże problem. Nie mam dużego doświadczenia z T4. To powiedziawszy, używam go do budowy wielu plików w moim projekcie i nie natknąłem się na problem, na który napotykasz.

W moim przypadku mam kilka indywidualnych plików .tt, które renderują poszczególne pliki w moim projekcie.

Droga Robię to w następujący sposób: Mam metodę SaveOutput (skradziony gdzieś na stackoverflow, wierzę):

void SaveOutput(string outputFileName) 
{ 
    if (!string.IsNullOrEmpty(outputFileName)) 
    { 
     string templateDirectory = Path.GetDirectoryName(Host.TemplateFile); 
     string outputFilePath = Path.Combine(templateDirectory, outputFileName); 
     string output = this.GenerationEnvironment.ToString(); 
     File.WriteAllText(outputFilePath, output); 
    } 

    this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length); 
} 

Więc moim głównym pliku .tt mam < # @ zawiera ... #> dla moich różnych plików .tt dla poszczególnych plików. Na przykład: < # @ include file = "DataObjectInterface.tt" #>

<#+ 
    public string GenerateInterfaceDataObject(sqlTable table) 
    { 
     string ifaceName = "I" + table.ObjectName; 
     if (table.GenerateInterfaceObjectAsBase) 
     { 
      ifaceName += "Base"; 
     } 
#> 
using System; 

namespace <#= InterfaceNamespace #> 
{ 
    public interface <#= ifaceName #> 
    { 
<#+ 
     foreach(sqlColumn col in table.Columns) 
     { 
#> 
     <#= GetColumnCSharpDataType(col) #> <#= col.FieldName #> { get; } 
<#+ 
     } 
#> 
    } 
} 
<#+ 
     return RootPath + @"\AutoGenerated\" + ifaceName + ".cs"; 
    } 
#> 

Wtedy, moim głównym klasy .tt, ja po prostu nawiązać połączenie tak:

string filePath = GenerateInterfaceDataObject(table); 
SaveOutput(filePath); 

nie wiem, czy ta metoda przełamywania twoich szablonów będzie działać zgodnie z twoimi potrzebami, ale zadziałała dla mnie i nie mam z tym żadnych problemów.

Należy wyjaśnić, że mój główny plik .tt w rzeczywistości nie generuje niczego od siebie. Nie jest szablonem. Po prostu ładuje każdy z szablonów i generuje pliki z innych szablonów.

Powiązane problemy