2012-10-30 15 views
9

Ho un modello T4 che elabora diversi file .tt nel mio progetto. Ho anche alcune classi personalizzate che ho definito per aiutare con il processo di trasformazione del codice.Generazione del codice T4 durante la compilazione, riferimento all'assembly personalizzato

<#@ template language="C#" hostspecific="True" debug="True" #> 
<#@ output extension="cs" #> 
<#@ assembly name="System.Core.dll" #> 
<#@ assembly name="$(TargetDir)\MyDependency.dll" #> 

Questo funziona in Visual Studio, ho una macro VS che definisce $ (TargetDir) correttamente.

Ora, voglio eseguire il processo di generazione del codice durante il mio processo di compilazione. Ho aggiunto:

<TransformOnBuild>true</TransformOnBuild> 
<OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles> 
<IncludeDslT4Settings>true</IncludeDslT4Settings> <ItemGroup> 
<T4ReferencePath Include="$(OutputPath)" /> 
</ItemGroup> 
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" /> 

mia build corre, ma ottengo:

C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating. target (407): l'host ha generato un'eccezione durante il tentativo di risolvere il riferimento all'assembly '$ (TargetDir) \ MyDependency.dll'. La trasformazione non verrà eseguita. È stata generata la seguente eccezione: System.IO.FileLoadException: il nome dell'assembly o il codebase specificato era non valido. (Eccezione da HRESULT: 0x80131047) a System.Reflection.AssemblyName.nInit (RuntimeAssembly & assemblaggio, booleano forIntrospection, booleano raiseResolveEvent) a System.Reflection.AssemblyName.nInit() in Microsoft.VisualStudio.TextTemplating.GlobalAssemblyCacheHelper.GetLocation (String StrongName) a Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost.ResolveAssemblyReference (String assemblyReference) a Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences (ITextTemplatingEngineHost ospite, sessione di TemplateProcessingSession). Riga = -1, colonna = -1

Ovviamente non risolverà $(TargetDir) nel contesto di generazione Team.

Ho provato ad aggiungere TargetDir al gruppo di proprietà della mia configurazione di build, senza alcun risultato. Questo valore non passa attraverso il contesto del generatore di codice T4.

Non voglio utilizzare una variabile di ambiente.

Come è possibile impostare $(TargetDir) correttamente nel contesto di Team Build?

+0

Oleg Sych scritto su integrazione msbuild: http: //www.olegsych.it/2010/04/understanding-t4-msbuild-integration/# IncludeFolders. Non posso dire se risolve il tuo problema ma sembra essere una buona guida sull'argomento. – FuleSnabel

+0

Sì, nessun dado lì .. –

risposta

4

Non vedo dove $ (OutputPath) è definito da Visual Studio. hai provato $ (TargetDir) nel tuo articolo w/nel tuo progetto? Quindi è possibile rimuovere $ (TargetDir) \ dalla dichiarazione dell'Assembly nel file T4.

Ho appena lavorato con un gran numero di possibilità per ottenere qualcosa di simile al lavoro, farò un post sul blog oggi o domani.

Quindi:

<ItemGroup> 
    <T4ReferencePath Include="$(TargetDir)" /> 
</ItemGroup> 

nel vostro csproj e

<#@ assembly name="MyDependency.dll" #> 

nel file T4

+0

Ecco il post sul blog promesso. Scusa per il ritardo! http://netitude.bc3tech.net/2013/06/15/t4-gotchyas-in-your-environment/ – bc3tech

Problemi correlati