Como obtenho um modelo T4 para gerar sua saída em cada build? Como é agora, ele só a regenera quando faço uma alteração no modelo.
Eu encontrei outras perguntas semelhantes a esta:
Transformação T4 e ordem de compilação no Visual Studio (sem resposta)
Como obter arquivos t4 para criar no visual studio? (as respostas não são detalhadas o suficiente [embora ainda sejam bastante complicadas] e nem fazem todo o sentido)
Tem que haver uma maneira mais simples de fazer isso!
visual-studio
tfs
msbuild
t4
JoelFan
fonte
fonte
Respostas:
Eu usei a resposta de JoelFan para chegar a isso. Eu gosto mais porque você não precisa se lembrar de modificar o evento de pré-construção toda vez que adicionar um novo arquivo .tt ao projeto.
%PATH%
transform_all ..\..
"transform_all.bat
fonte
"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe"
) no arquivo de lote, em vez de adicioná-lo para% PATH%%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe
. Coloque-o entre aspas duplas.TextTransform.exe
merda. Você já pode clicar com o botão direito do mouse em "Executar ferramenta personalizada" no Visual Studio, para que ele já tenha o caminho da ferramenta. Por que tenho que passar pelo trabalho de fornecê-lo novamente quando estou construindo a partir de um contexto do Visual Studio?Eu concordo com o GarethJ - no VS2010, é muito mais fácil regenerar os modelos tt em cada build. O blog de Oleg Sych descreve como fazê-lo. Em resumo:
</Project>
É isso aí. Abra seu projeto. Em cada build, todos os modelos * .tt serão reprocessados
fonte
msbuild mySolution.sln /p:CustomAfterMicrosoftCommonTargets="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" /p:TransformOnBuild=true /p:TransformOutOfDateOnly=false
Existe um ótimo pacote NuGet que faz exatamente isso:
Detalhes sobre o pacote podem ser encontrados aqui
fonte
content
construir ações<#@ template language="C#" #>
Usei a resposta do MarkGr e desenvolvi esta solução. Primeiro, crie um arquivo em lotes chamado RunTemplate.bat em uma pasta de ferramentas separada acima da pasta principal da solução. O arquivo em lotes tem apenas a linha:
Este arquivo em lotes usa 2 parâmetros ... % 1 é o caminho para o arquivo .tt sem a extensão .tt. % 2 é o caminho para as DLLs mencionadas pelas diretivas Assembly no modelo.
Em seguida, acesse as Propriedades do projeto que contém o modelo T4. Acesse Build Events e adicione a seguinte linha de comando do evento Pre-build :
substituindo MyTemplate pelo nome do arquivo .tt (ou seja, MyTemplate.tt) sem a extensão .tt. Isso resultará na expansão do modelo para produzir MyTemplate.cs antes da criação do projeto. Em seguida, a compilação real compilará o MyTemplate.cs
fonte
Recentemente, encontrei este ótimo plug-in do VS, Chirpy .
Ele não apenas gera seu T4 em uma compilação, mas permite uma abordagem baseada em T4 para minificação de javascript, CSS e ainda permite que você use menos sintaxe para seu CSS!
fonte
Provavelmente, a maneira mais simples é instalar uma extensão do Visual Studio chamada AutoT4 .
Ele executa todos os modelos T4 na construção automagicamente.
fonte
A pré-construção pode ser reduzida para uma única linha:
Isso transforma todos os
.tt
arquivos no projeto e os lista na saída da compilação.Se você não quiser a saída da compilação, precisará contornar algum "comportamento interessante" :
Obviamente, você pode extrair isso para um arquivo em lotes para o qual passa o caminho do diretório do projeto, se desejar.
NB O caminho pode exigir alguns ajustes. O caminho acima é onde o VS 2008 o instalou na minha máquina; mas você pode achar que o número da versão entre
TextTemplating
eTextTransform.exe
é diferente.fonte
System.Exception: T4MVC can only execute through the Visual Studio host
Confira C: \ Arquivos de programas (x86) \ Arquivos comuns \ Microsoft Shared \ TextTemplating. Existe um exe de transformação de linha de comando. Como alternativa, escreva uma tarefa do MSBuild com um host personalizado e faça a transformação por conta própria.
fonte
Expandindo em Seth Reno e as respostas de JoelFan , eu vim com isso. Com esta solução, não é necessário lembrar-se de modificar o evento de pré-construção toda vez que você adicionar um novo arquivo .tt ao projeto.
Procedimento de Implementação
transform_all.bat "$(ProjectDir)" $(ProjectExt)
para cada projeto com um .tt que você deseja criartransform_all.bat
NOTAS
A transformação de texto assume que o código no modelo T4 é o mesmo idioma que o seu tipo de projeto. Se esse caso não se aplicar a você, será necessário substituir o
$(ProjectExt)
argumento pela extensão dos arquivos que você deseja que o código gere..TT
os arquivos devem estar no diretório do projeto, caso contrário não serão construídos. Você pode construir arquivos TT fora do diretório do projeto, especificando um caminho diferente como o primeiro argumento ( ou seja, substituir"$(ProjectDir)"
pelo caminho que contém os arquivos TT).Lembre-se também de definir o caminho correto para o
transform_all.bat
arquivo em lotes.Por exemplo, coloquei-o no diretório da solução para que o evento de pré-construção fosse o seguinte
"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)
fonte
t4list.txt
arquivo no PasteBin para tentar ver se o erro está vindo de lá?for /f "delims=" %%d in (t4list.txt) do (
e as restrições corporativas o impedirem de postar seut4list.txt
arquivo, receio que não haja muito o que fazer para ajudá-lo. Eu realmente queria ajudar a resolver isso, mas parece que será impossível, pois não tenho dados para prosseguir. Boa sorte na solução do problema e lembre-se de postar sua solução quando tiver êxito.(this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
? Infelizmente, recebo uma exceção de referência nula quando executo tt de fora do visual studio.Se você estiver usando o Visual Studio 2010, poderá usar o SDK de Modelagem e Visualização do Visual Studio: http://code.msdn.microsoft.com/vsvmsdk
Isso contém tarefas msbuild para executar modelos T4 no momento da construção.
Dê uma olhada no blog de Oleg para obter mais explicações: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration
fonte
Ei, meu script também pode analisar a extensão de saída
Basta criar
transform_all.bat $(SolutionDir)
um evento de pré-construção, e todos os arquivos * .tt em sua solução serão transformados automaticamente.fonte
O Dynamo.AutoTT fará o que você precisa. Você pode configurá-lo para assistir arquivos por meio de um regex ou gerar na compilação. Ele também permite especificar quais modelos T4 você deseja que ele ative.
Você pode fazer o download aqui : https://github.com/MartinF/Dynamo.AutoTT
Apenas construa, copie os arquivos dll e AddIn para
C: \ Usuários \ Documentos \ Visual Studio 2012 \ Addins \
e você vai embora.
Se você deseja colocá-lo no VS2012, precisará modificar o arquivo Dynamo.AutoTT.AddIn e definir a Versão como 11.0 dentro do arquivo AddIn;
fonte
Graças ao GitHub.com/Mono/T4 , no momento você pode fazer isso para compilações do .NET Core e do Visual Studio adicionando isso ao seu
.csproj
arquivo:Se você transformar seus modelos em diferentes linguagens de programação, adicione algo como
<Compile Remove="**\*.vb" />
e<Compile Include="**\*.vb" />
para compilar esses arquivos, mesmo que você ainda não tenha gerado arquivos.Remove
eInclude
truque necessário apenas para a primeira geração, ou você pode tornar o XML mais curto assim:e apenas execute o build duas vezes (pela primeira vez). Se você já gerou arquivos confirmados no repositório, não haverá problemas nas reconstruções com os dois exemplos.
No Visual Studio, você pode querer ver algo assim:
em vez disso:
Portanto, adicione algo assim ao seu arquivo de projeto:
Exemplo completo aqui: GitHub.com/Konard/T4GenericsExample (inclui a geração de vários arquivos a partir de um único modelo).
fonte
Aqui está a minha solução - semelhante à resposta aceita. Tivemos um problema com nosso controle de origem. Os arquivos .cs de destino são somente leitura e o T4 estava falhando. Aqui está o código, que executa o T4 na pasta temp, compara os arquivos de destino e os copia apenas no caso da mesma alteração. Não corrige o problema com os arquivos read.only, mas pelo menos não ocorre com muita frequência:
Transform.bat
Você pode tentar adicionar seu comando de check-out em uma linha (:: Você pode tentar ....)
No seu projeto, defina isso como uma ação de pré-construção:
fonte
Você só precisa adicionar este comando ao evento de pré-construção do projeto:
A verificação em configuration = debug garante que você não gere novamente o código no modo de liberação, quando você faz a compilação no servidor de compilação do TFS, por exemplo.
fonte
No visual studio 2013, clique com o botão direito do mouse no modelo T4 e defina a propriedade transform on build para true.
fonte
Aqui está como eu lidei com isso. Link . Basicamente, construindo sobre um ótimo blog (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ não pode postar mais que 2 links :() Eu criei este arquivo .targets para usar com os arquivos de projeção do visual studio.
É útil quando você está usando outras dll-s dentro do seu .tt e deseja que o resultado seja alterado à medida que as dll-s estão sendo alteradas.
Como funciona:
Remova as referências de montagem de .tt
Dentro do arquivo proj, use este código para configurar a transformação na compilação:
Primeira parte localiza TextTransform.exe
$(IncludeForTransform)
será igual a,c:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dll
porque essa é a maneira de adicionar referências para o TextTransform na linha de comando<_TextTransform Include="$(ProjectDir)**\*.tt" />
isso cria uma lista de todos os arquivos tt dentro do projeto e subdiretórios<Exec Command="...
produz uma linha para cada um dos arquivos .tt encontrados que se parece com"C:\path\to\Transform.exe" "c:\path\to\my\proj\TransformFile.tt" -r"c:\path\to\foo.dll" -r "c:\path\to\bar.dll"
A única coisa a fazer é adicionar os caminhos para as dlls dentro de:
Aqui,
<InProject>False</InProject>
oculta esses itens da exibição da soluçãoPortanto, agora você deve poder gerar seu código na compilação e na alteração de dll-s.
Você pode remover a ferramenta personalizada (das propriedades dentro do Visual Studio) para que o VS não tente transformar e falhar miseravelmente todas as vezes. Como removemos as referências de montagem na etapa 2
fonte
O T4Executer faz isso para o VS2019. Você pode especificar modelos para ignorar na construção, e há uma opção executar após a construção.
fonte
Você acabou de instalar o Pacote NuGet : Clarius.TransformOnBuild
Então, toda vez que você clicar em Reconstruir projeto (ou Solução), seus arquivos .tt serão executados
fonte
No Visual Studio 2017 (provavelmente também nas próximas versões), você deve adicionar isso no evento Pre-build:
ps Altere o caminho para o seu modelo se ele não estiver localizado no diretório raiz do projeto.
fonte
Um cara construiu um pacote de pepitas para isso.
Nota: Recebo erros de compilação do TextTemplate.exe e desse pacote (porque esse pacote chama TextTemplate.exe), mas não do Visual Studio. Então, aparentemente, o comportamento não é o mesmo; Atenção.
EDIT: Este acabou sendo o meu problema.
fonte
Aqui está um evento de pré-construção usando apenas o Microsoft Tooling e caminhos padrão. Foi testado no vs2019 / netcore3.1.
Substitua "AppDbContext.tt" pelo caminho do arquivo relativo ao projeto:
A Microsoft também possui um guia para disponibilizar macros como "$ (SolutionDirectory)" no modelo usando T4ParameterValues no arquivo do projeto.
fonte