Her derlemede bir T4 Şablonu çalıştırmak için Visual Studio'yu edinin


163

Her derlemede çıktısını oluşturmak için bir T4 şablonunu nasıl edinebilirim? Şu an olduğu gibi, yalnızca şablonda bir değişiklik yaptığımda yeniden oluşturuyor.

Buna benzer başka sorular buldum:

Visual Studio'da T4 dönüşümü ve oluşturma sırası (cevapsız)

Visual Studio'da t4 dosyaları oluşturmak için nasıl? (cevaplar yeterince ayrıntılı olmasa da [oldukça karmaşık olmasına rağmen) ve tam anlamıyla anlamıyor bile)

Bunu yapmanın daha basit bir yolu olmalı!


Ben şahsen buna bir cevap duymak ilgimi çekse de, sizin özel senaryosunuz nedir? Normalde şablonun çıktısı yalnızca girdinin bir fonksiyonu olmalıdır, bu nedenle değişiklik üretilmesi iyidir.
Pavel Minaev

6
Şablonum, son derlemeden bu yana değişmiş olabilecek diğer derlemeleri incelemek için yansıma kullanır.
JoelFan


Şablonum bir amaca hizmet eder, derleme tarihi saatini kaydeder.
Scott Solmer

Yanıtlar:


68

JoelFan'ın cevabını bununla gelmek için kullandım. Projeye her yeni bir .tt dosyası eklediğinizde pre-build olayını değiştirmeyi hatırlamanız gerekmediğinden daha iyi seviyorum.

  • TextTransform.exe dosyasını %PATH%
  • transform_all.bat adlı bir toplu iş dosyası oluşturdu (aşağıya bakın)
  • önceden oluşturulmuş bir etkinlik oluştur " 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
Güzel çözüm. Ben "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe"% PATH% eklemek yerine, toplu iş dosyasına TextTransform.exe ( ) tam yol koymak tercih etti
Adam Nofsinger 9:11

20
Daha iyi bir değişken, 64bit sisteminde de çalışacağı için% COMMONPROGRAMFILES% yerine% COMMONPROGRAMFILES (x86) olacaktır.
Durden81

3
Yani tam yol olacak %COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe. Çift tırnak içine alın.
northben

1
@ piers7: Komut dosyasını çalıştıran işletim sisteminin 'bit'ini otomatik olarak algılamak için kodu güncelledim. Ayrıca objenin dizinini atlamak için northben yorumu ekledim ve Adam Nofsinger'ın% PATH% ortam değişkenini değiştirmeme tercihini uyguladım.
Alex Essilfie

1
IMHO TextTransform.exeberbat bir yol sağlamak zorunda . Visual Studio'da "Özel Aracı Çalıştır" ı sağ tıklatabilirsiniz, böylece aracın yolu vardır. Bir Visual Studio bağlamından oluştururken neden yeniden sağlama işini yürütmem gerekiyor?
Jez

70

GarethJ ile hemfikirim - VS2010'da her yapıda tt şablonlarını yeniden oluşturmak çok daha kolay. Oleg Sych'ın blogu nasıl yapılacağını açıklar. Kısacası:

  1. Visual Studio SDK'yı yükleyin
  2. Visual Studio 2010 Modelleme ve Görselleştirme SDK'sını Yükleme
  3. Metin düzenleyici proje dosyasında açın ve dosyanın sonuna ekleyin ancak önce </Project>

Bu kadar. Projenizi açın. Her derlemede tüm * .tt şablonları yeniden işlenir

<!-- 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
İşte Oleg Sych'ın blog yazısı için bir link: olegsych.com/2010/04/understanding-t4-msbuild-integration
PhilChuang

4
Bu çok güzel bir çözüm. Ancak, SDK'ların yüklenmesine gerek kalmadan bunu çalıştırmanın bir yolu var mı? Ben .targets dosyaları ve ilgili derlemeleri dışarı kopyalayarak, ama başarılı olmadan işe almak için çalışıyorum.
Grimus

3
Chirpy herhangi bir SDK'yı indirmeden çalışıyor gibi görünüyor ... ancak yine de Chirpy'ı indirip yapılandırmanız gerekiyor. Hala VS2010 varsayılan yüklemesinde çalışan bir çözüm bulmaya çalışıyorum ve kaynak deposu üzerinden kullanılabilir olacak, böylece geliştiriciler sadece çalışması için repo kontrol gerekir. Tüm bu diğer çözümler, geliştirici başına çok fazla dikkat gerektirir.
Mir

1
Projelerinizi MSBuild'in x64 sürümünü kullanarak oluşturursanız - bu hatayı alırsınız: 'MSB4019: İçe aktarılan proje "C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating.targets " bulunamadı.' hata. Geçici çözüm - $ (MSBuildExtensionsPath) değişkenini bir proje dosyasında $ (MSBuildExtensionsPath32) ile değiştirin.
Paslı

3
Ayrıca, .csproj dosyalarını düzeltmeniz gerekmez. Komut satırından şöyle bir şey çağırın 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

29

Sadece bunu yapan harika bir NuGet paketi var:

PM> Install-Package Clarius.TransformOnBuild

Paket hakkında detaylar burada bulunabilir


2
'Resmi olmayan' bir çatal var: nuget.org/packages/Clarius.TransformOnBuild-unofficial , contentyapı eylemlerini destekleyen
Erno

1
Böylece, Güzel uzatma ama o CommandLine modunda TextTransform.exe çalışıyor konut organizmalara karşı spesifiktir = "true" funcions olacak değil çalışma
GH61

1
@JenishRabadiya Bu satırı şablonun en üstüne ekleyin:<#@ template language="C#" #>
Peter van Kekem

2
Görünüşe göre paket hostspecific = "true" ve diğer sorunları destekleyecek şekilde güncellendi (8 gün önce)
Mingwei Samuel

1
İçerik oluşturma işlemi artık en son sürümle çalışıyor.
androbin

20

MarkGr'ın cevabını kullandım ve bu çözümü geliştirdim. İlk olarak, ana çözüm klasörünün üzerindeki ayrı bir araç klasöründe RunTemplate.bat adlı bir toplu iş dosyası oluşturun . Toplu iş dosyasında şu satır bulunur:

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

Bu toplu iş dosyası 2 parametre alır ... % 1 , .tt uzantısı olmayan .tt dosyasının yoludur. % 2 , şablonda derleme yönergelerinde belirtilen DLL'lerin yoludur .

Ardından, T4 şablonunu içeren projenin Proje Özelliklerine gidin. Gidin Yapı Olaylar ve aşağıdakileri ekleyin Öncesi build olay komut satırı :

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

MyTemplate'i , .tt uzantısı olmadan .tt dosyanızın (yani MyTemplate.tt) dosya adıyla değiştirmek . Bu, projeyi oluşturmadan önce MyTemplate.cs üretmek için şablonu genişletme sonucunu doğuracaktır. Ardından asıl derleme MyTemplate.cs dosyasını derler



1
$ (SolutionDir) çevresindeki teklifleri unutmayın .. \ .. \ tools \ RunTemplate.bat
Ewald Hofman

14

Son zamanlarda bu harika VS eklentisi Chirpy'yi buldu .

T4'ünüzü bir derleme üzerinde oluşturmakla kalmaz, aynı zamanda javascript, CSS'nin küçültülmesi için T4 tabanlı bir yaklaşıma izin verir ve hatta CSS'niz için LESS sözdizimini kullanmanızı sağlar!


13

Muhtemelen en basit yol, AutoT4 adlı bir Visual Studio uzantısı kurmaktır .

Tüm T4 şablonlarını otomatik olarak derleme üzerinde çalıştırır.


Kabul! Yapılandırılabilir ve VS 2015 ile çalışır. Tüm yöntemlerin yapmadığı EnvDTE montajının (yapı yapılandırmasını almak için) kullanımını bile destekler. Tek dezavantajı, tüm ekip üyelerinin uzantıyı yüklemeleri gerektiğidir.
Gyromite

12

Ön yapım tek bir satıra indirgenebilir:

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

Bu .tt, projedeki tüm dosyaları dönüştürür ve derleme çıktısına listeler.

Derleme çıktısını istemiyorsanız, o zaman bazı "ilginç davranışlar" etrafında çalışmak zorundasınız :

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

Elbette, isterseniz proje dizini yolunu geçtiğiniz bir toplu iş dosyasına da çekebilirsiniz.

Not : Yol biraz ince ayar gerektirebilir. Yukarıdaki yol VS 2008'in makineme kurduğu yerdir; ancak TextTemplatingve arasındaki sürüm numarasının TextTransform.exefarklı olduğunu görebilirsiniz.


@SprintStar, VS 2012'niz varsa muhtemelen daha iyi bir yol var. Diğer cevaplar VS 2010 için zaten var olan daha iyi yollar hakkında konuşuyor.
Peter Taylor

Bu en iyi yöntem, çünkü hiçbir şey yüklemem gerekmiyor.
Ryan Gates

1
1.2 yok gördüm ama bir 12.0 vardı, bu yüzden bunu değiştirdi ama bu hatayı aldık:System.Exception: T4MVC can only execute through the Visual Studio host
colmde

1
Sadece 1.2 yerine 14.0 kullanmak için klasör yolunu güncellemek zorunda kaldı ve gitmek için iyi.
pistol-pete

Bu benim görüşüme göre en iyi çözümdü (sadece yukarıda belirtildiği gibi 14.0 değişiyor)
Nelson Rodriguez

9

C: \ Program Files (x86) \ Common Files \ Microsoft Shared \ Text komutunu inceleyin Komut satırı dönüşümü exe var. Alternatif olarak, özel bir ana bilgisayarla bir MSBuild görevi yazın ve dönüşümü kendiniz yapın.


1
Oh, 2010 yılında "devenv / Command TextTransformation.TransformAllTemplates / Command File.Exit MySolution.sln" gibi şeyler yapabilmenize rağmen, zaman zaman sunucuları oluşturma eğilimi gösterir. En iyi seçeneğiniz, özel bir ana bilgisayarla MSBuild görevi yazmaktır.
MarkGr

Masaüstü yapıları için, bir TransformAllTemplates yapan bir makro ve ardından bir yapı oluşturun.
MarkGr

7

Seth Reno ve JoelFan'ın cevaplarına genişleyerek , bunu buldum. Bu çözümle, projeye her yeni bir .tt dosyası eklediğinizde pre-build olayını değiştirmeyi hatırlamanız gerekmez.

Uygulama Prosedürü

  • Transform_all.bat adlı bir toplu iş dosyası oluşturun (aşağıya bakın)
  • Oluşturmak transform_all.bat "$(ProjectDir)" $(ProjectExt)istediğiniz bir .tt içeren her proje için bir derleme öncesi etkinliği oluşturun

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


NOTLAR

  1. Metin dönüşümü, T4 şablonundaki kodun proje türünüzle aynı dilde olduğunu varsayar. Bu durum sizin için geçerli değilse, $(ProjectExt)bağımsız değişkeni kodun oluşturulmasını istediğiniz dosyaların uzantısıyla değiştirmeniz gerekir .

  2. .TTdosyalar proje dizininde olmalıdır, aksi takdirde oluşturmazlar. İlk bağımsız değişken olarak farklı bir yol belirterek TT dosyalarını proje dizininin dışında oluşturabilirsiniz ( örn"$(ProjectDir)" . TT dosyalarını içeren yolla değiştirin ).

  3. transform_all.batToplu iş dosyasına doğru yolu ayarlamayı da unutmayın .
    Örneğin, pre-build olayı aşağıdaki şekilde olacak şekilde çözüm dizinime yerleştirdim"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)


Bu yaklaşımı kullanmaya çalışıyorum, ancak '\ Common şu anda beklenmedik bir durumla' hata alıyorum. benim çıkışımda. Bu şu satırda gerçekleşir: (t4list.txt) içinde / f "delims =" %% d için ... Ne eksik olduğum hakkında bir fikrin var mı?
Michael Lewis

@MichaelLewis: Hata dosyasına neyin neden olabileceğini fark etmeden toplu iş dosyasını birkaç kez geçtim. Aynı hatayı oluşturup oluşturmadığını görmek için Seth Reno tarafından önerilen yöntemi deneyin . Bu arada, t4list.txtdosyanızı PasteBin'e gönderebilir misiniz, böylece hatanın oradan gelip gelmediğini görmeye çalışabilir miyim?
Alex Essilfie

Seth'in aynı konudaki yaklaşımını denedim ('\ Şimdilik ortak beklenmedikti'). Kurumsal kısıtlamalar nedeniyle t4list.txt dosyasını gönderemiyorum, ancak bir satırdan oluşuyor ve \ Common yolda görünmüyor.
Michael Lewis

@MichaelLewis: Maalesef, hatanız meydana gelirse for /f "delims=" %%d in (t4list.txt) do (ve şirket kısıtlamaları t4list.txtdosyanızı göndermenizi engelliyorsa, size yardımcı olmak için yapabileceğim çok şey olmadığından korkuyorum. Bunu çözmek için gerçekten yardım etmek istemiştim ama ilerlemek için hiçbir veri olmadığından imkansız olacak gibi görünüyor. Sorunu çözmede iyi şanslar ve başarılı olduğunuzda lütfen çözümünüzü göndermeyi unutmayın.
Alex Essilfie

Aynı şeyi tt içerdiğinde yapmak mümkün müdür (this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;? Ne yazık ki, görsel stüdyoda değil tt koştuğumda null referans istisnası alıyorum .
Andrey


4

Hey, betiğim çıktı uzantısını da ayrıştırabilir

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%

Sadece transform_all.bat $(SolutionDir)pre-build olayı oluşturun ve çözümünüzdeki tüm * .tt dosyaları otomatik olarak dönüştürülecektir.


3

Dynamo.AutoTT ihtiyacınız olanı yapacak. Bir regex ile dosyaları izlemek veya yapı üzerinde oluşturmak için yapılandırabilirsiniz. Ayrıca, hangi T4 şablonlarını tetiklemesini istediğinizi belirtmenize olanak tanır.

Buradan indirebilirsiniz: https://github.com/MartinF/Dynamo.AutoTT

Sadece oluşturun, dll ve AddIn dosyalarını kopyalayın

C: \ Kullanıcılar \ Belgeler \ Visual Studio 2012 \ Eklentiler \

ve uzağa gidiyorsun.

VS2012'de devam etmek istiyorsanız, bir Dynamo.AutoTT.AddIn dosyasını değiştirmeniz ve AddIn dosyası içinde Sürüm'ü 11.0 olarak ayarlamanız gerekir;


3

GitHub.com/Mono/T4 sayesinde , şu anda bunu hem .csprojdosyanıza ekleyerek hem .NET Core hem de Visual Studio derlemeleri için yapabilirsiniz :

  <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>

Farklı programlama dilleri Şablonlarınızı dönüşümü Eğer böyle bir şey eklemek gerekir <Compile Remove="**\*.vb" />ve <Compile Include="**\*.vb" />henüz dosyalarını oluşturmuş olmasa bile derlenmiş bu dosyaları almak için.

Removeve Includehile yalnızca ilk kez oluşturma için gereklidir veya XML'yi şu şekilde kısaltabilirsiniz:

  <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>

ve sadece iki kez inşa çalıştırın (ilk kez). Depoya zaten taahhüt edilmiş dosyalar oluşturduysanız, her iki örnekle de yeniden oluşturmalarda herhangi bir sorun olmayacaktır.

Visual Studio'da şöyle bir şey görmek isteyebilirsiniz:

resim açıklamasını buraya girin

bunun yerine:

resim açıklamasını buraya girin

Proje dosyanıza böyle bir şey ekleyin:

  <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>

Burada tam örnek: GitHub.com/Konard/T4GenericsExample (tek bir şablondan birden fazla dosya oluşturulmasını içerir).


1

İşte benim çözümüm - kabul edilen cevaba benzer. Kaynak kontrolümüzle ilgili bir sorun yaşadık. Hedef .cs dosyaları salt okunur ve T4 başarısız oldu. Geçici klasörde T4'ü çalıştıran, hedef dosyaları karşılaştıran ve yalnızca aynı değişiklik olması durumunda kopyalayan kod. Read.only dosyalarıyla ilgili sorunu çözmez, ancak en azından çok sık ortaya çıkmaz:

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

Çıkış komutunuzu bir satıra eklemeyi deneyebilirsiniz (:: Deneyebilirsiniz ....)

Projenizde bunu bir ön yapım eylemi olarak ayarlayın:

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

1

Sadece bu komutu projenin önceden oluşturma olayına eklemeniz gerekir:

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

Yapılandırma = hata ayıklama denetimi, örneğin TFS derleme sunucusunda derleme yaptığınızda kodu serbest bırakma modunda yeniden oluşturmamanızı sağlar.


T4MVC projede sadece tt değilse ve hepsini çalıştırmak istemiyorsak güzel ama hepsini dönüştürmek tehlikeli olabilir ...
Landeeyo

3
V11.0 klasöründe TextTemplating yok. Bunu nereden alıyorsun?
Zack

1

Visual studio 2013'te, T4 şablonunu sağ tıklayın ve build özelliğindeki transformu true olarak ayarlayın.


1
Sağ tıklama menüsünde bu seçeneği bulamıyorum, ancak MSDN'ye göre VS 2012 ve 2013'te proje dosyasını düzenleyerek bunu yapmak mümkün, bkz. Msdn.microsoft.com/en-us/library/ee847423. ayrıntılar için aspx veya msdn.microsoft.com/en-us/library/vstudio/ee847423.aspx
yoel halb

Bu, Visual Studio'da varsayılan olarak değil, yalnızca somut T4 araçlarıyla birlikte gelen bir seçenek gibi görünüyor.
Matt DiTrolio

Evet, bu sadece T4 Toolbox'ın pro versiyonunda.
Pompair

1

İşte böyle yaptım. Bağlantı . Temel olarak harika bir blogun üzerine inşa (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-instal-a-visual-studio-sdk/, 2'den fazla yayın yapamaz links :() Visual Studio projelerinde kullanmak için Bu .targets dosyası ile geldim .

.Tt içindeki diğer dll-s kullandığınızda ve dll-s değiştikçe sonucun değişmesini istediğinizde kullanışlıdır.

Nasıl çalışır:

  1. Tt dosyasını oluşturun, derleme adı = "$ (SolutionDir) yolunu \ diğer \ proje \ output \ foo.dll dosyasına ekleyin ve dönüşümü ve sonucu beklendiği gibi ayarlayın
  2. Derleme başvurularını .tt dosyasından kaldırın.

  3. Proj dosyasının içinde derlemede dönüşüm ayarlamak için bu kodu kullanın:

    <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>
    • İlk bölüm TextTransform.exe dosyasını bulur

    • $(IncludeForTransform)eşit olacaktır c:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dllçünkü komut satırına TextTransform için referans eklemenin yolu

       <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" />bu proje ve alt dizinlerdeki tüm tt dosyalarının bir listesini oluşturur

    • <Exec Command="... bulunan her .tt dosyası için bir satır oluşturur. "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. Yapılması gereken tek şey, içindeki dll'lere yolları eklemektir:

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

    İşte <InProject>False</InProject>bu öğeleri Çözüm Görünümünden gizler

Yani şimdi kodunuzu derleme ve dll-s değişiklik üzerine oluşturmak mümkün olmalıdır.

Özel aracı (Visual Studio içindeki özelliklerden) kaldırabilirsiniz, böylece VS her seferinde dönüştürmeye ve perişan başarısız olmaya çalışmaz. Çünkü 2. adımda derleme referanslarını kaldırdık


Daha fazla bağlam sağlamak için lütfen çözümün yanıtını kendinize ekleyin. Bağlantılar sorunun çözümü değildir ve diğer kullanıcılar bu soruya daha sonra geri döndüklerinde ölü olabilirler.
Frank van Wijk

1

T4Executer bunu VS2019 için yapar. Derlemede yoksaymak için şablonlar belirtebilirsiniz ve derlemeden sonra yürütme seçeneği vardır.


1

NuGet Paketini kurmanız yeterlidir : Clarius.TransformOnBuild

Ardından, Projeyi yeniden oluştur'u (veya Çözümü) her tıkladığınızda , .tt dosyalarınız çalışır


1

Visual Studio 2017'de (muhtemelen sonraki sürümler de) bunu Pre-build etkinliğine eklemelisiniz:

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

ps Kök proje dizininde yoksa şablonunuzun yolunu değiştirin.


0

Bazıları bunun için bir nuget paketi yaptı .

Yan not: Derleme hataları hem TextTemplate.exe hem de bu paketten (çünkü bu paket TextTemplate.exe çağırır) alır ama Visual Studio değil. Görünüşe göre davranış aynı değil; dikkat et.

EDIT: Bu benim sorunum oldu.


0

Burada, yalnızca Microsoft Tooling ve standart yolları kullanan bir pre-build etkinliği var. Vs2019 / netcore3.1 sürümünde test edilmiştir.

"AppDbContext.tt" dosyasını projeye bağlı dosya yolunuzla değiştirin:

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

Microsoft ayrıca, proje dosyanızda T4ParameterValues kullanarak "$ (SolutionDirectory)" gibi makroları şablonda kullanılabilir hale getirmek için bir kılavuza sahiptir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.