Ottieni Visual Studio per eseguire un modello T4 su ogni build


164

Come posso ottenere un modello T4 per generare il suo output su ogni build? Come è ora, lo rigenera solo quando apporto una modifica al modello.

Ho trovato altre domande simili a questa:

Trasformazione T4 e ordine di compilazione in Visual Studio (senza risposta)

Come ottenere file t4 da compilare in Visual Studio? (le risposte non sono abbastanza dettagliate [pur essendo ancora molto complicate] e non hanno nemmeno un senso totale)

Deve esserci un modo più semplice per farlo!


Mentre sarei personalmente piuttosto interessato a ricevere una risposta a questo, qual è il tuo scenario particolare? Normalmente l'output del template dovrebbe essere solo una funzione dell'input, quindi la generazione al cambio va bene.
Pavel Minaev,

6
Il mio modello utilizza la riflessione per esaminare altri assiemi, che potrebbero essere cambiati dall'ultima build.
JoelFan,


Il mio modello ha uno scopo, registra l'ora della data di costruzione.
Scott Solmer,

Risposte:


69

Ho usato la risposta di JoelFan per trovare questo. Mi piace di più perché non devi ricordarti di modificare l'evento pre-build ogni volta che aggiungi un nuovo file .tt al progetto.

  • aggiungi TextTransform.exe al tuo %PATH%
  • creato un file batch chiamato transform_all.bat (vedi sotto)
  • crea un evento pre-build " transform_all ..\.."

transform_all.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: set the working dir (default to current dir)
set wdir=%cd%
if not (%1)==() set wdir=%1

:: set the file extension (default to vb)
set extension=vb
if not (%2)==() set extension=%2

echo executing transform_all from %wdir%
:: create a list of all the T4 templates in the working dir
dir %wdir%\*.tt /b /s > t4list.txt

echo the following T4 templates will be transformed:
type t4list.txt

:: transform all the templates
for /f %%d in (t4list.txt) do (
set file_name=%%d
set file_name=!file_name:~0,-3!.%extension%
echo:  \--^> !file_name!    
TextTransform.exe -out !file_name! %%d
)

echo transformation complete

28
Bella soluzione. Ho preferito inserire il percorso completo di TextTransform.exe ( "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe") nel file batch, piuttosto che aggiungerlo a% PATH%
Adam Nofsinger

20
Una variabile migliore sarebbe% COMMONPROGRAMFILES (x86)% anziché% COMMONPROGRAMFILES% poiché funzionerebbe anche su un sistema a 64 bit.
Durden81,

3
Quindi sarà il percorso completo %COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe. Avvolgilo tra virgolette doppie.
Northben,

1
@ piers7: ho aggiornato il codice per rilevare automaticamente il 'bitness' del sistema operativo che esegue lo script. Ho anche incluso il commento di Northben per saltare la directory obj e ho implementato la preferenza di Adam Nofsinger sul non modificare la variabile d'ambiente% PATH%.
Alex Essilfie,

1
IMHO deve fornire il percorso per TextTransform.exesucchiare. Puoi già fare clic con il pulsante destro del mouse su "Esegui strumento personalizzato" in Visual Studio, quindi ha già il percorso dello strumento. Perché devo passare attraverso il lavoro di fornirlo di nuovo quando sto costruendo da un contesto di Visual Studio?
Jez,

70

Concordo con GarethJ: in VS2010 è molto più semplice rigenerare i template tt su ogni build. Il blog di Oleg Sych descrive come farlo. In breve:

  1. Installa Visual Studio SDK
  2. Installa Visual Studio 2010 Modeling and Visualization SDK
  3. Apri nel file di progetto dell'editor di testo e aggiungi alla fine del file, ma prima </Project>

Questo è tutto. Apri il tuo progetto. Su ogni build verranno rielaborati tutti i modelli * .tt

<!-- This line could already present in file. If it is so just skip it  -->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- process *.tt templates on each build  -->
<PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />

2
Ecco un link al post del blog di Oleg Sych: olegsych.com/2010/04/understanding-t4-msbuild-integration
PhilChuang

4
Questa è un'ottima soluzione. Tuttavia, esiste un modo per farlo funzionare senza richiedere l'installazione degli SDK? Ho cercato di farlo funzionare copiando i file .targets e i relativi assiemi, ma senza successo.
grimus

3
Chirpy sembra funzionare senza dover scaricare alcun SDK ... tuttavia, devi ancora scaricare e configurare Chirpy. Sto ancora cercando di scoprire una soluzione che funziona su un'installazione predefinita di VS2010 e sarà disponibile tramite il repository di origine in modo che gli sviluppatori debbano solo controllare il repository affinché funzioni. Tutte queste altre soluzioni richiedono troppa attenzione per sviluppatore.
Mir

1
Se costruisci i tuoi progetti utilizzando la versione x64 di MSBuild, otterrai questo errore: "MSB4019: Il progetto importato" C: \ Programmi (x86) \ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating.targets " Non è stato trovato.' errore. Soluzione alternativa: sostituire la variabile $ (MSBuildExtensionsPath) con $ (MSBuildExtensionsPath32) in un file di progetto.
Arrugginito,

3
Inoltre, non è necessario patchare i file .csproj. Dalla riga di comando invoca qualcosa del genere msbuild mySolution.sln /p:CustomAfterMicrosoftCommonTargets="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" /p:TransformOnBuild=true /p:TransformOutOfDateOnly=false
Giulio Vian,

30

Esiste un ottimo pacchetto NuGet che fa proprio questo:

PM> Install-Package Clarius.TransformOnBuild

I dettagli sul pacchetto sono disponibili qui


2
C'è un fork "non ufficiale": nuget.org/packages/Clarius.TransformOnBuild-unofficial che supporta le contentazioni di costruzione
Erno,

1
E 'bello, ma l'estensione è in esecuzione TextTransform.exe in modalità di comando, in modo hostspecific = "true" funcions sarà non lavoro
Gh61

2
@JenishRabadiya Aggiungi questa riga all'inizio del modello:<#@ template language="C#" #>
Peter van Kekem

3
Sembra che il pacchetto sia stato aggiornato per supportare hostspecific = "true" e altri problemi (8 giorni fa)
Mingwei Samuel

1
L'azione di creazione del contenuto funziona ora con l'ultima versione.
androbin,

20

Ho usato la risposta di MarkGr e ho sviluppato questa soluzione. Innanzitutto, crea un file batch chiamato RunTemplate.bat in una cartella strumenti separata sopra la cartella principale della soluzione. Il file batch ha solo la riga:

"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out %1.cs -P %2 -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" %1.tt

Questo file batch accetta 2 parametri ... % 1 è il percorso del file .tt senza estensione .tt. % 2 è il percorso di tutte le DLL a cui fa riferimento direttive Assembly nel modello.

Quindi, vai nelle proprietà del progetto del progetto contenente il modello T4. Vai a Build Events e aggiungi la seguente riga di comando dell'evento Pre-build :

$(SolutionDir)..\..\tools\RunTemplate.bat $(ProjectDir)MyTemplate $(OutDir)

sostituendo MyTemplate con il nome del tuo file .tt (cioè MyTemplate.tt) senza l'estensione .tt. Ciò avrà il risultato di espandere il modello per produrre MyTemplate.cs prima di creare il progetto. Quindi la build effettiva compilerà MyTemplate.cs


anche se ho ancora il problema: stackoverflow.com/questions/1669893/...
JoelFan

1
Non dimenticare le virgolette intorno a $ (SolutionDir) .. \ .. \ tools \ RunTemplate.bat
Ewald Hofman,

14

Recentemente ho trovato questo fantastico plugin VS, Chirpy .

Non solo genera il tuo T4 su una build, ma consente un approccio basato su T4 alla minimizzazione di javascript, CSS e ti consente persino di usare MENO sintassi per il tuo CSS!


13

Probabilmente il modo più semplice è installare un'estensione di Visual Studio chiamata AutoT4 .

Esegue tutti i modelli T4 su build automagicamente.


Concordato! Configurabile e funziona con VS 2015. Supporta persino l'uso dell'assembly EnvDTE (per ottenere la configurazione di build), cosa che non tutti i metodi fanno. L'unico aspetto negativo è che tutti i membri del team devono installare l'estensione.
Gyromite,

12

La pre-build può essere ridotta a una sola riga:

forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c echo Transforming @path && \"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"

Ciò trasforma tutti i .ttfile nel progetto e li elenca nell'output di generazione.

Se non si desidera l'output di generazione, è necessario aggirare alcuni "comportamenti interessanti" :

forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c @\"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"

Naturalmente, è possibile estrarlo in un file batch a cui si passa il percorso della directory del progetto, se lo si desidera.

NB Il percorso potrebbe richiedere alcune modifiche. Il percorso sopra è dove VS 2008 lo ha installato sulla mia macchina; ma potresti scoprire che il numero di versione tra TextTemplatinge TextTransform.exeè diverso.


@SprintStar, se hai VS 2012 probabilmente c'è un modo migliore per farlo. Altre risposte parlano di modi migliori già esistenti per VS 2010.
Peter Taylor,

Questo è il metodo migliore, perché non devo installare nulla.
Ryan Gates,

1
Ho visto che non ce System.Exception: T4MVC can only execute through the Visual Studio host
n'era

1
Ho dovuto aggiornare il percorso della cartella per utilizzare 14.0 anziché 1.2 e basta andare.
pistola-pete

Questa è stata la migliore soluzione secondo me (solo cambiando 14.0 come menzionato sopra)
Nelson Rodriguez,

9

Dai un'occhiata a C: \ Programmi (x86) \ File comuni \ Microsoft Shared \ TextTemplating c'è un exe di trasformazione da riga di comando. In alternativa, scrivi un'attività MSBuild con un host personalizzato e fai tu stesso la trasformazione.


1
Oh, anche se puoi fare cose come "devenv / Command TextTransformation.TransformAllTemplates / Command File.Exit MySolution.sln" nel 2010 tende a rompere occasionalmente sui server di build. La soluzione migliore è scrivere un'attività MSBuild con un host personalizzato.
MarkGr,

Per le build desktop, basta creare una macro che esegua un TransformAllTemplates e quindi una build.
MarkGr,

7

Espansione su Seth Reno e JoelFan risposte di , ho a questo. Con questa soluzione non è necessario ricordare di modificare l'evento pre-build ogni volta che si aggiunge un nuovo file .tt al progetto.

Procedura di attuazione

  • Crea un file batch chiamato transform_all.bat (vedi sotto)
  • Crea un evento pre-build transform_all.bat "$(ProjectDir)" $(ProjectExt)per ogni progetto con un .tt che desideri creare

transform_all.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: set the correct path to the the app
if not defined ProgramFiles(x86). (
  echo 32-bit OS detected
  set ttPath=%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\
) else (
  echo 64-bit OS detected
  set ttPath=%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\
)

:: set the working dir (default to current dir)
if not (%1)==() pushd %~dp1

:: set the file extension (default to vb)
set ext=%2
if /i %ext:~1%==vbproj (
  set ext=vb
) else if /i %ext:~1%==csproj (
  set ext=cs
) else if /i [%ext%]==[] (
  set ext=vb
)

:: create a list of all the T4 templates in the working dir
echo Running TextTransform from %cd%
dir *.tt /b /s | findstr /vi obj > t4list.txt

:: transform all the templates
set blank=.
for /f "delims=" %%d in (t4list.txt) do (
  set file_name=%%d
  set file_name=!file_name:~0,-3!.%ext%
  echo:  \--^> !!file_name:%cd%=%blank%!
  "%ttPath%TextTransform.exe" -out "!file_name!" "%%d"
)

:: delete T4 list and return to previous directory
del t4list.txt
popd

echo T4 transformation complete


APPUNTI

  1. La trasformazione del testo presuppone che il codice nel modello T4 abbia la stessa lingua del tipo di progetto. Se questo caso non ti riguarda, dovrai sostituire l' $(ProjectExt)argomento con l'estensione dei file che desideri vengano generati dal codice.

  2. .TTi file devono trovarsi nella directory del progetto altrimenti non verranno compilati. È possibile creare file TT all'esterno della directory del progetto specificando un percorso diverso come primo argomento ( ovvero sostituire "$(ProjectDir)"con il percorso contenente i file TT).

  3. Ricorda anche di impostare il percorso corretto per il transform_all.batfile batch.
    Ad esempio, l'ho inserito nella mia directory della soluzione, quindi l'evento pre-build era il seguente"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)


Sto cercando di utilizzare questo approccio, ma continuo a ricevere un errore, con "\ Common era imprevisto in questo momento". nella mia uscita. Succede proprio su questa riga: for / f "delims =" %% d in (t4list.txt) fare ... Hai idea di cosa mi sto perdendo?
Michael Lewis,

@MichaelLewis: Ho esaminato più volte il file batch senza individuare ciò che potrebbe causare l'errore. Si prega di provare il metodo proposto da Seth Reno per vedere se genera lo stesso errore. Nel frattempo, puoi per favore pubblicare il tuo t4list.txtfile su PasteBin, quindi provo a vedere se il tuo errore proviene da lì?
Alex Essilfie,

Ho provato l'approccio di Seth con lo stesso problema ("\ Common era inaspettato in questo momento"). Non riesco a pubblicare il file t4list.txt a causa delle restrizioni aziendali, ma è costituito da una riga e \ Common non viene visualizzato nel percorso.
Michael Lewis,

@MichaelLewis: Sfortunatamente, se il tuo errore si verifica for /f "delims=" %%d in (t4list.txt) do (e le restrizioni aziendali ti impediscono di pubblicare il tuo t4list.txtfile, temo che non ci sia molto che posso fare per aiutarti. Volevo davvero aiutare a risolvere questo problema, ma sembra che sarà impossibile dato che non ho dati per procedere. Buona fortuna nel risolvere il problema e ricordati gentilmente di pubblicare la tua soluzione quando hai successo.
Alex Essilfie,

È possibile fare lo stesso quando tt contiene (this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;? Sfortunatamente, ottengo un'eccezione di riferimento null quando corro tt da non all'interno di Visual Studio.
Andrey K.


4

Ehi, il mio script può anche analizzare l'estensione di output

for /r %1 %%f in (*.tt) do (
 for /f "tokens=3,4 delims==, " %%a in (%%f) do (
  if %%~a==extension "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out %%~pnf.%%~b -P %%~pf -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" %%f
 )
)
echo Exit Code = %ERRORLEVEL%

Basta creare transform_all.bat $(SolutionDir)un evento pre-build e tutti i file * .tt nella soluzione verranno trasformati automaticamente.


3

Dynamo.AutoTT farà ciò di cui hai bisogno. È possibile configurarlo per guardare i file tramite un regex o generare su build. Inoltre, consente di specificare quali modelli T4 si desidera attivare.

Puoi scaricarlo da qui: https://github.com/MartinF/Dynamo.AutoTT

Basta costruirlo, copiare i file dll e AddIn in

C: \ Users \ Documents \ Visual Studio 2012 \ Addins \

e vai via.

Se vuoi farlo funzionare in VS2012 dovrai modificare il file a Dynamo.AutoTT.AddIn e impostare la versione su 11.0 all'interno del file AddIn;


3

Grazie a GitHub.com/Mono/T4 , al momento puoi farlo sia per build .NET Core che Visual Studio aggiungendo questo al tuo .csprojfile:

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-t4-project-tool" Version="2.0.5" />
    <TextTemplate Include="**\*.tt" />
  </ItemGroup>

  <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
    <ItemGroup>
      <Compile Remove="**\*.cs" />
    </ItemGroup>
    <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 %(TextTemplate.Identity)" />
    <ItemGroup>
      <Compile Include="**\*.cs" />
    </ItemGroup>
  </Target>

Se trasformi i tuoi modelli in diversi linguaggi di programmazione, dovresti aggiungere qualcosa come <Compile Remove="**\*.vb" />e<Compile Include="**\*.vb" /> per compilare questi file anche se non hai ancora generato i file.

Removee Includetrucco necessari solo per la prima generazione di generazione, oppure puoi accorciare XML in questo modo:

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-t4-project-tool" Version="2.0.5" />
    <TextTemplate Include="**\*.tt" />
  </ItemGroup>

  <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
    <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 %(TextTemplate.Identity)" />
  </Target>

ed esegui build due volte (per la prima volta). Se hai già generato file impegnati nel repository non ci saranno problemi con le ricostruzioni con entrambi gli esempi.

In Visual Studio potresti voler vedere qualcosa del genere:

inserisci qui la descrizione dell'immagine

Invece di questo:

inserisci qui la descrizione dell'immagine

Quindi aggiungi qualcosa di simile al tuo file di progetto:

  <ItemGroup>
    <Compile Update="UInt16Class.cs">
      <DependentUpon>UInt16Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt32Class.cs">
      <DependentUpon>UInt32Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt64Class.cs">
      <DependentUpon>UInt64Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt8Class.cs">
      <DependentUpon>UInt8Class.tt</DependentUpon>
    </Compile>
  </ItemGroup>

Esempio completo qui: GitHub.com/Konard/T4GenericsExample (include la generazione di più file da un singolo modello).


1

Ecco la mia soluzione - simile alla risposta accettata. Abbiamo avuto un problema con il nostro controllo del codice sorgente. I file .cs di destinazione sono di sola lettura e il T4 non funzionava. Ecco il codice, che esegue T4 nella cartella temporanea, confronta i file di destinazione e lo copia solo in caso di stessa modifica. Non risolve il problema con i file read.only, ma almeno non si verifica molto spesso:

Transform.bat

ECHO Transforming T4 templates
SET CurrentDirBackup=%CD%
CD %1
ECHO %1
FOR /r %%f IN (*.tt) DO call :Transform %%f
CD %CurrentDirBackup%
ECHO T4 templates transformed
goto End

:Transform
set ttFile=%1
set csFile=%1

ECHO Transforming %ttFile%:
SET csFile=%ttFile:~0,-2%cs
For %%A in ("%ttFile%") do Set tempTT=%TEMP%\%%~nxA
For %%A in ("%csFile%") do Set tempCS=%TEMP%\%%~nxA

copy "%ttFile%" "%tempTT%
"%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe"  "%tempTT%"

fc %tempCS% %csFile% > nul
if errorlevel 1 (
 :: You can try to insert you check-out command here.
 "%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe"  "%ttFile%"
) ELSE (
 ECHO  no change in %csFile%
)

del %tempTT%
del %tempCS%
goto :eof

:End

Puoi provare ad aggiungere il tuo comando di check-out su una riga (:: Puoi provare ....)

Nel progetto, impostalo come azione pre-compilata:

Path-To-Transform.bat "$(ProjectDir)"

1

Devi solo aggiungere questo comando all'evento pre-build del progetto:

if $(ConfigurationName) == Debug $(MSBuildToolsPath)\Msbuild.exe  /p:CustomBeforeMicrosoftCSharpTargets="$(ProgramFiles)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets"  $(ProjectPath) /t:TransformAll 

Il controllo su configuration = debug, assicura che non si rigeneri il codice in modalità di rilascio, ad esempio quando si esegue la build sul server di build TFS.


Bello ma trasformare tutto potrebbe essere pericoloso se T4MVC non è solo tt nel progetto e non vogliamo far funzionare tutto ...
Landeeyo,

3
Non ho TextTemplating nella cartella v11.0. Da dove lo prendi?
Zack,

1

In Visual Studio 2013, fare clic con il pulsante destro del mouse sul modello T4 e impostare la proprietà di trasformazione su build su true.


1
Non riesco a trovare questa opzione nel menu di scelta rapida, tuttavia secondo MSDN è possibile farlo modificando il file di progetto in VS 2012 e 2013, vedere msdn.microsoft.com/en-us/library/ee847423. aspx o msdn.microsoft.com/en-us/library/vstudio/ee847423.aspx per i dettagli
yoel halb

Questa sembra essere un'opzione fornita solo con strumenti T4 tangibili, non predefiniti in Visual Studio.
Matt DiTrolio,

Sì, questo è solo nella versione pro di T4 Toolbox.
Pompair,

1

Ecco come l'ho affrontato. Link . Fondamentalmente basandosi su un grande blog (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ non posso pubblicare più di 2 links :() Ho inventato questo .targets file da utilizzare con i file proj di Visual Studio.

È utile quando stai usando altre DLL all'interno del tuo .tt e vuoi che il risultato cambi mentre le DLL stanno cambiando.

Come funziona:

  1. Creare il tt, aggiungere il nome dell'assembly = "$ (SolutionDir) percorso \ a \ other \ project \ output \ foo.dll e impostare la trasformazione e il risultato come previsto
  2. Rimuovere i riferimenti di assieme da .tt

  3. All'interno del file proj usa questo codice per impostare transform on build:

    <PropertyGroup>
      <!-- Initial default value -->
      <_TransformExe>$(CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe</_TransformExe>
      <!-- If explicit VS version, override default -->
      <_TransformExe Condition="'$(VisualStudioVersion)' != ''">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe</_TransformExe>
      <!-- Cascading probing if file not found -->
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\11.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\12.0\TextTransform.exe</_TransformExe>
      <!-- Future proof 'til VS2013+2 -->
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\13.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\14.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\15.0\TextTransform.exe</_TransformExe>
    
      <IncludeForTransform>@(DllsToInclude, '&amp;quot; -r &amp;quot;')</IncludeForTransform>
    </PropertyGroup>
    • Prima parte Individua TextTransform.exe

    • $(IncludeForTransform)sarà uguale a c:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dllperché questo è il modo di aggiungere riferimenti per TextTransform sulla riga di comando

       <Target Name="TransformOnBuild" BeforeTargets="BeforeBuild">
         <!--<Message Text="$(IncludeForTransform)" />-->
         <Error Text="Failed to find TextTransform.exe tool at '$(_TransformExe)." Condition="!Exists('$(_TransformExe)')" />
         <ItemGroup>
           <_TextTransform Include="$(ProjectDir)**\*.tt" />
         </ItemGroup>
         <!-- Perform task batching for each file -->
         <Exec Command="&quot;$(_TransformExe)&quot; &quot;@(_TextTransform)&quot; -r &quot;$(IncludeForTransform)&quot;" Condition="'%(Identity)' != ''" />
       </Target>
    • <_TextTransform Include="$(ProjectDir)**\*.tt" />questo crea un elenco di tutti i file tt all'interno del progetto e delle sottodirectory

    • <Exec Command="... produce una linea per ciascuno dei file .tt trovati che appare "C:\path\to\Transform.exe" "c:\path\to\my\proj\TransformFile.tt" -r"c:\path\to\foo.dll" -r "c:\path\to\bar.dll"

  4. L'unica cosa che resta da fare è aggiungere i percorsi alle dll all'interno di:

        <ItemGroup>
          <DllsToInclude Include="$(ProjectDir)path\to\foo.dll">
            <InProject>False</InProject>
          </DllsToInclude>
          <DllsToInclude Include="$(ProjectDir)path\to\bar.dll">
            <InProject>False</InProject>
          </DllsToInclude>
        </ItemGroup>

    Qui <InProject>False</InProject>nasconde questi elementi dalla Vista soluzione

Quindi ora dovresti essere in grado di generare il tuo codice su build e su change di dll-s.

È possibile rimuovere lo strumento personalizzato (dalle proprietà all'interno di Visual Studio) in modo che VS non cerchi di trasformare e fallire miseramente ogni volta. Perché abbiamo rimosso i riferimenti di assieme nel passaggio 2


Aggiungi la soluzione stessa alla tua risposta per fornire più contesto. I collegamenti non sono una soluzione alla domanda e potrebbero essere morti quando altri utenti tornano a questa domanda in seguito.
Frank van Wijk,

1

T4Executer lo fa per VS2019. È possibile specificare i modelli da ignorare durante la compilazione e esiste un'opzione di esecuzione dopo la compilazione.


1

È sufficiente installare il pacchetto NuGet : Clarius.TransformOnBuild

Quindi, ogni volta che fai clic su Ricostruisci progetto (o soluzione), verranno eseguiti i tuoi file .tt


1

In Visual Studio 2017 (probabilmente anche le versioni successive), dovresti aggiungerlo nell'evento Pre-build:

"$(DevEnvDir)TextTransform.exe" -out "$(ProjectDir)YourTemplate.cs" "$(ProjectDir)YourTemplate.tt"

ps Cambia il percorso del tuo modello se non si trova nella directory del progetto principale.


0

Qualcuno ha creato un pacchetto nuget per questo.

Nota a margine: ottengo errori di compilazione sia da TextTemplate.exe che da quel pacchetto (perché quel pacchetto chiama TextTemplate.exe) ma non da Visual Studio. Quindi apparentemente il comportamento non è lo stesso; dritta.

EDIT: Questo ha finito per essere il mio problema.


0

Ecco un evento pre-build che utilizza solo strumenti Microsoft e percorsi standard. È testato in vs2019 / netcore3.1.

Sostituisci "AppDbContext.tt" con il percorso del file relativo al progetto:

"$(MSBuildBinPath)\msbuild" $(SolutionPath) /t:$(ProjectName):Transform /p:TransformFile="AppDbContext.tt" /p:CustomAfterMicrosoftCommonTargets="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets"

Microsoft ha anche una guida per rendere disponibili macro come "$ (SolutionDirectory)" nel modello utilizzando T4ParameterValues nel file di progetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.