Dapatkan Visual Studio untuk menjalankan Template T4 di setiap bangunan


163

Bagaimana cara mendapatkan templat T4 untuk menghasilkan output pada setiap build? Seperti sekarang, itu hanya membuat ulang ketika saya membuat perubahan pada templat.

Saya telah menemukan pertanyaan lain yang mirip dengan ini:

Transformasi T4 dan membangun ketertiban dalam Visual Studio (tidak dijawab)

Bagaimana cara membuat file t4 di studio visual?(jawaban tidak cukup detail [sementara masih banyak rumit] dan bahkan tidak masuk akal total)

Pasti ada cara yang lebih sederhana untuk melakukan ini!


Sementara saya pribadi akan sangat tertarik untuk mendengar jawaban untuk ini, apa skenario khusus Anda? Biasanya output dari template seharusnya hanya berfungsi sebagai input saja, sehingga menghasilkan perubahan tidak masalah.
Pavel Minaev

6
Template saya menggunakan refleksi untuk memeriksa majelis lain, yang mungkin telah berubah sejak build terakhir.
JoelFan


Template saya melayani satu tujuan, mencatat waktu pembuatan tanggal.
Scott Solmer

Jawaban:


68

Saya menggunakan jawaban JoelFan untuk muncul bersama ini. Saya menyukainya lebih baik karena Anda tidak harus ingat untuk memodifikasi acara pra-bangun setiap kali Anda menambahkan file .tt baru ke proyek.

  • tambahkan TextTransform.exe ke %PATH%
  • membuat file batch bernama transform_all.bat (lihat di bawah)
  • buat acara pra-bangun " 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
Solusi bagus Saya lebih suka meletakkan path lengkap ke TextTransform.exe ( "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe") dalam file batch, daripada menambahkannya ke% PATH%
Adam Nofsinger

20
Variabel yang lebih baik adalah% COMMONPROGRAMFILES (x86)% daripada% COMMONPROGRAMFILES% karena juga akan bekerja pada sistem 64bit.
Durden81

3
Jadi jalan penuh akan terjadi %COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe. Bungkus dengan tanda kutip ganda.
northben

1
@ piers7: Saya memperbarui kode untuk secara otomatis mendeteksi 'bitness' dari OS yang menjalankan skrip. Saya juga menyertakan komentar northben untuk melewati direktori obj dan mengimplementasikan preferensi Adam Nofsinger untuk tidak mengubah variabel lingkungan% PATH%.
Alex Essilfie

1
IMHO harus menyediakan jalan untuk TextTransform.exemenyebalkan. Anda sudah dapat mengklik kanan "Jalankan Alat Kustom" di Visual Studio, sehingga sudah memiliki jalur alat. Mengapa saya harus melalui pekerjaan menyediakannya lagi ketika saya membangun dari konteks Visual Studio?
Jez

70

Saya setuju dengan GarethJ - dalam VS2010 jauh lebih mudah untuk membuat ulang tt templat pada setiap build. Blog Oleg Sych menjelaskan cara melakukannya. Pendeknya:

  1. Instal Visual Studio SDK
  2. Instal Visual Studio 2010 Pemodelan dan Visualisasi SDK
  3. Buka di file proyek editor teks dan tambahkan ke akhir file tetapi sebelumnya </Project>

Itu dia. Buka proyek Anda. Pada setiap build semua * .tt templat akan diproses ulang

<!-- 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
Berikut tautan ke posting blog Oleg Sych: olegsych.com/2010/04/understanding-t4-msbuild-integration
PhilChuang

4
Ini solusi yang sangat bagus. Namun apakah ada cara untuk menjalankannya tanpa perlu menginstal SDK? Saya sudah mencoba membuatnya berfungsi dengan menyalin file .target dan rakitan terkait, tetapi tidak berhasil.
grimus

3
Chirpy tampaknya berfungsi tanpa harus mengunduh SDK apa pun ... namun, Anda masih harus mengunduh dan mengonfigurasi Chirpy. Saya masih mencoba menemukan solusi yang berfungsi pada instalasi default VS2010, dan akan tersedia melalui repositori sumber sehingga pengembang hanya perlu memeriksa repo agar bisa berfungsi. Semua solusi lain ini membutuhkan perhatian per pengembang yang terlalu banyak.
Mir

1
Jika Anda membangun proyek Anda menggunakan MSBuild versi x64 - Anda akan mendapatkan kesalahan ini: 'MSB4019: Proyek yang diimpor "C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating.targets " tidak ditemukan.' kesalahan. Penanganan masalah - ganti variabel $ (MSBuildExtensionsPath) dengan $ (MSBuildExtensionsPath32) dalam file proyek.
Berkarat

3
Selain itu, Anda tidak perlu menambal file .csproj. Dari baris perintah panggil sesuatu seperti 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

Ada paket NuGet hebat yang melakukan hal ini:

PM> Install-Package Clarius.TransformOnBuild

Rincian tentang paket dapat ditemukan di sini


2
Ada garpu 'tidak resmi': nuget.org/packages/Clarius.TransformOnBuild-unofficial yang mendukung contenttindakan build
Erno

1
Ini ekstensi yang bagus tetapi sedang menjalankan TextTransform.exe dalam mode commandLine, jadi fungsi hostspecific = "true" tidak
Gh61

1
@JenishRabadiya Tambahkan baris ini ke atas template:<#@ template language="C#" #>
Peter van Kekem

2
Tampaknya paket itu telah diperbarui untuk mendukung hostspecific = "true" dan masalah lainnya (8 hari yang lalu)
Mingwei Samuel

1
Tindakan membangun konten berfungsi sekarang dengan versi terbaru.
androbin

20

Saya menggunakan jawaban MarkGr dan mengembangkan solusi ini. Pertama, buat file batch yang disebut RunTemplate.bat di folder alat terpisah di atas folder solusi utama. File batch hanya memiliki garis:

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

File batch ini mengambil 2 parameter ... % 1 adalah path ke file .tt tanpa ekstensi .tt. % 2 adalah jalur ke setiap DLL yang dirujuk oleh arahan Majelis dalam templat.

Selanjutnya, masuk ke Properti Proyek dari proyek yang berisi template T4. Pergilah ke Bangun Acara dan tambahkan baris perintah acara Bangun sebelumnya :

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

mengganti MyTemplate dengan nama file file .tt Anda (yaitu MyTemplate.tt) tanpa ekstensi .tt. Ini akan memiliki hasil memperluas templat untuk menghasilkan MyTemplate.cs sebelum membangun proyek. Kemudian build aktual akan mengkompilasi MyTemplate.cs


meskipun saya masih memiliki masalah: stackoverflow.com/questions/1669893/...
JoelFan

1
Jangan lupa tanda kutip di sekitar $ (SolutionDir) .. \ .. \ tools \ RunTemplate.bat
Ewald Hofman

14

Baru-baru ini menemukan plugin VS yang hebat ini, Chirpy .

Tidak hanya menghasilkan T4 pada build, tetapi juga memungkinkan pendekatan berbasis T4 untuk meminimalkan javascript, CSS, dan bahkan memungkinkan Anda menggunakan sintaks KURANG untuk CSS Anda!


13

Mungkin cara paling sederhana adalah menginstal ekstensi Visual Studio yang disebut AutoT4 .

Ini menjalankan semua templat T4 pada pembuatan secara otomatis.


Sepakat! Dapat dikonfigurasi, dan berfungsi dengan VS 2015. Bahkan mendukung penggunaan perakitan EnvDTE (untuk mendapatkan konfigurasi pembangunan), yang tidak semua metode lakukan. Satu-satunya downside adalah bahwa semua anggota tim harus menginstal ekstensi.
Gyromite

12

Pra-bangun dapat direduksi menjadi satu baris:

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

Ini mengubah semua .ttfile dalam proyek dan mencantumkannya ke output build.

Jika Anda tidak ingin output build maka Anda harus mengatasi beberapa "perilaku menarik" :

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

Tentu saja, Anda bisa menarik ini ke dalam file batch yang Anda lewati jalur direktori proyek jika Anda mau.

NB Path mungkin memerlukan beberapa penyesuaian. Jalur di atas adalah tempat VS 2008 menginstalnya di mesin saya; tetapi Anda mungkin menemukan bahwa nomor versi antara TextTemplatingdan TextTransform.exeberbeda.


@ PrintStar, jika Anda memiliki VS 2012 mungkin ada cara yang lebih baik untuk melakukannya. Jawaban lain berbicara tentang cara yang lebih baik yang sudah ada untuk VS 2010.
Peter Taylor

Ini adalah metode terbaik, karena saya tidak perlu menginstal apa pun.
Ryan Gates

1
Melihat tidak ada 1.2 tetapi ada 12.0 jadi mengubahnya ke itu tetapi mendapat kesalahan ini:System.Exception: T4MVC can only execute through the Visual Studio host
colmde

1
Baru saja memperbarui jalur folder untuk menggunakan 14.0 bukan 1.2 dan bagus untuk pergi.
pistol-pete

Ini adalah solusi terbaik menurut saya (hanya mengubah 14.0 seperti yang disebutkan di atas)
Nelson Rodriguez

9

Lihat C: \ Program Files (x86) \ Common Files \ Microsoft Shared \ TextTemplating ada exe transformasi baris perintah di sana. Atau menulis tugas MSBuild dengan host kustom dan melakukan transformasi sendiri.


1
Oh, meskipun Anda dapat melakukan hal-hal seperti "devenv / Command TextTransformation.TransformAllTemplates / Command File. Keluar dari MySolution.sln" pada 2010, ia cenderung rusak pada server yang sedang membangun sesekali. Taruhan terbaik Anda adalah menulis tugas MSBuild dengan host kustom.
MarkGr

Untuk build desktop, cukup buat makro yang melakukan TransformAllTemplates, lalu build.
MarkGr

7

Memperluas jawaban Seth Reno dan JoelFan , saya datang dengan ini. Dengan solusi ini tidak perlu mengingat untuk memodifikasi acara pra-bangun setiap kali Anda menambahkan file .tt baru ke proyek.

Prosedur Implementasi

  • Buat file batch bernama transform_all.bat (lihat di bawah)
  • Buat acara pra-bangun transform_all.bat "$(ProjectDir)" $(ProjectExt)untuk setiap proyek dengan .tt yang ingin Anda buat

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


CATATAN

  1. Transformasi teks mengasumsikan kode dalam templat T4 adalah bahasa yang sama dengan jenis proyek Anda. Jika kasus ini tidak berlaku untuk Anda, maka Anda harus mengganti $(ProjectExt)argumen dengan ekstensi file yang Anda inginkan untuk dihasilkan oleh kode.

  2. .TTfile harus ada di direktori proyek agar tidak dapat dibangun. Anda dapat membuat file TT di luar direktori proyek dengan menentukan jalur yang berbeda sebagai argumen pertama ( mis. Ganti "$(ProjectDir)"dengan jalur yang berisi file TT.)

  3. Ingat juga untuk mengatur jalur yang benar ke transform_all.batfile batch.
    Sebagai contoh, saya menempatkannya di direktori solusi saya sehingga acara pra-bangun adalah sebagai berikut"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)


Saya mencoba menggunakan pendekatan ini, tetapi saya terus mendapatkan kesalahan, dengan '\ Common tidak terduga saat ini.' dalam output saya. Itu terjadi tepat di baris ini: untuk / f "delims =" %% d di (t4list.txt) lakukan ... Adakah yang tahu apa yang saya lewatkan?
Michael Lewis

@MichaelLewis: Saya telah melalui file batch beberapa kali tanpa melihat apa yang bisa menyebabkan kesalahan. Silakan coba metode yang diusulkan oleh Seth Reno untuk melihat apakah itu menghasilkan kesalahan yang sama. Sementara itu, bisakah Anda memposting t4list.txtfile Anda ke PasteBin jadi saya mencoba untuk melihat apakah kesalahan Anda berasal dari sana?
Alex Essilfie

Saya mencoba pendekatan Seth dengan masalah yang sama ('\ Common saat ini tidak terduga'). Saya tidak dapat memposting file t4list.txt karena batasan perusahaan, tetapi terdiri dari satu baris, dan \ Common tidak muncul di jalur.
Michael Lewis

@MichaelLewis: Sayangnya, jika kesalahan Anda terjadi pada for /f "delims=" %%d in (t4list.txt) do (dan batasan perusahaan mencegah Anda memposting t4list.txtfile Anda , maka saya khawatir tidak banyak yang bisa saya lakukan untuk membantu Anda. Saya benar-benar ingin membantu menyelesaikan ini, tetapi sepertinya tidak mungkin karena saya tidak memiliki data untuk melanjutkan. Semoga berhasil dalam memperbaiki masalah ini dan ingatlah untuk mengirim solusi ketika Anda berhasil.
Alex Essilfie

Apakah mungkin untuk melakukan hal yang sama ketika tt mengandung (this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;? Sayangnya, saya mendapatkan pengecualian referensi nol , ketika saya menjalankan tt dari tidak di dalam studio visual.
Andrey K.


4

Hai, skrip saya juga dapat mem-parsing ekstensi keluaran

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%

Buat saja transform_all.bat $(SolutionDir)acara pra-bangun, dan semua file * .tt dalam solusi Anda akan diubah secara otomatis.


3

Dynamo.AutoTT akan melakukan apa yang Anda butuhkan. Anda dapat mengonfigurasinya untuk menonton file melalui regex atau menghasilkan saat dibangun. Anda juga dapat menentukan templat T4 mana yang ingin Anda picu.

Anda dapat mengunduhnya dari sini: https://github.com/MartinF/Dynamo.AutoTT

Cukup buat, salin dll dan file AddIn ke

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

dan pergilah.

Jika Anda ingin menjalankannya dalam VS2012 Anda harus memodifikasi file Dynamo.AutoTT.AddIn dan mengatur Versi ke 11.0 di dalam file AddIn;


3

Terima kasih kepada GitHub.com/Mono/T4 , saat ini Anda dapat melakukannya untuk membangun .NET Core dan Visual Studio dengan menambahkan ini ke .csprojfile Anda :

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

Jika Anda mengubah template Anda ke bahasa pemrograman yang berbeda Anda harus menambahkan sesuatu seperti <Compile Remove="**\*.vb" />dan <Compile Include="**\*.vb" />untuk mendapatkan file-file ini dikompilasi bahkan jika Anda belum membuat file.

Removedan Includetrik hanya diperlukan untuk generasi pertama kali, atau Anda dapat membuat XML lebih pendek seperti ini:

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

dan jalankan build dua kali (untuk pertama kali). Jika Anda telah membuat file yang dikomit ke repositori, tidak akan ada masalah pada pembangunan kembali dengan kedua contoh.

Di Visual Studio Anda mungkin ingin melihat sesuatu seperti ini:

masukkan deskripsi gambar di sini

alih-alih ini:

masukkan deskripsi gambar di sini

Jadi tambahkan sesuatu seperti ini ke file proyek Anda:

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

Contoh lengkap di sini: GitHub.com/Konard/T4GenericsExample (termasuk pembuatan beberapa file dari templat tunggal).


1

Inilah solusi saya - mirip dengan jawaban yang diterima. Kami memiliki masalah dengan kontrol sumber kami. File .cs target hanya baca dan T4 gagal. Berikut adalah kode, yang menjalankan T4 di folder temp, membandingkan file target, dan menyalinnya hanya jika terjadi perubahan yang sama. Itu tidak memperbaiki masalah dengan file read.only, tapi setidaknya itu tidak terlalu sering terjadi:

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

Anda dapat mencoba menambahkan perintah check-out Anda pada sebuah baris (:: Anda dapat mencoba ....)

Di proyek Anda tetapkan ini sebagai tindakan prebuild:

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

1

Anda hanya perlu menambahkan perintah ini ke acara pra-bangun proyek:

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

Pemeriksaan konfigurasi = debug, pastikan Anda tidak membuat ulang kode dalam mode rilis, ketika Anda melakukan build di server build TFS misalnya.


Bagus tapi mengubah semua bisa berbahaya jika T4MVC tidak hanya dalam proyek dan kami tidak ingin menjalankan semua ...
Landeeyo

3
Saya tidak memiliki TextTemplating di folder v11.0. Dari mana Anda mendapatkannya?
Zack

1

Di visual studio 2013, klik kanan template T4 dan atur transformasi pada properti build menjadi true.


1
Saya tidak dapat menemukan opsi ini pada menu klik kanan, namun menurut MSDN adalah mungkin untuk melakukannya dengan mengedit file proyek di VS 2012 dan 2013, lihat msdn.microsoft.com/en-us/library/ee847423. aspx atau msdn.microsoft.com/en-us/library/vstudio/ee847423.aspx untuk detail
yoel halb

Ini tampaknya menjadi opsi yang datang dengan alat T4 nyata, bukan default di Visual Studio.
Matt DiTrolio

Ya ini hanya di versi pro T4 Toolbox.
Pompair

1

Inilah cara saya menempelkannya. Link . Pada dasarnya membangun di atas blog yang hebat (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ tidak dapat memposting lebih dari itu 2 links :() Saya datang dengan file .targets ini untuk digunakan dengan file proj studio visual.

Ini berguna ketika Anda menggunakan dll-s lain di dalam .tt Anda dan Anda ingin hasilnya berubah karena dll-s sedang berubah.

Bagaimana itu bekerja:

  1. Buat tt, tambahkan jalur nama perakitan = "$ (SolutionDir) \ ke \ other \ project \ output \ foo.dll dan atur transformasi dan hasilnya seperti yang diharapkan
  2. Hapus referensi perakitan dari .tt

  3. Di dalam file proj, gunakan kode ini untuk mengatur transformasi saat dibangun:

    <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>
    • Bagian pertama Menempatkan TextTransform.exe

    • $(IncludeForTransform)akan sama dengan c:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dllkarena itulah cara untuk menambahkan referensi untuk TextTransform pada baris perintah

       <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" />ini membuat daftar semua file tt di dalam proyek dan subdirektori

    • <Exec Command="... menghasilkan baris untuk setiap file .tt yang ditemukan yang terlihat seperti "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. Satu-satunya yang tersisa untuk dilakukan adalah menambahkan path ke dlls di dalam:

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

    Di sini <InProject>False</InProject>menyembunyikan item-item ini dari Tampilan Solusi

Jadi sekarang Anda harus dapat menghasilkan kode Anda pada build dan perubahan dll-s.

Anda dapat menghapus alat kustom (dari properti di dalam Visual Studio) sehingga VS tidak mencoba untuk mengubah dan gagal total setiap saat. Karena kami menghapus referensi perakitan pada langkah 2


Harap tambahkan solusi itu sendiri ke jawaban Anda untuk memberikan lebih banyak konteks. Tautan bukanlah solusi untuk pertanyaan dan mungkin mati ketika pengguna lain kembali ke pertanyaan ini nanti.
Frank van Wijk

1

T4Executer melakukan ini untuk VS2019. Anda bisa menentukan templat untuk diabaikan saat dibangun, dan ada opsi eksekusi setelah pembuatan.


1

Anda cukup menginstal Paket NuGet : Clarius.TransformOnBuild

Kemudian, setiap kali Anda mengklik proyek Rebuild (atau Solusi), file .tt Anda akan berjalan


1

Di Visual Studio 2017 (mungkin versi berikutnya juga), Anda harus menambahkan ini di acara Pra-bangun:

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

ps Ubah path ke template Anda jika lokasinya tidak di direktori proyek root.


0

Beberapa orang membangun paket nuget untuk ini.

Catatan: Saya mendapatkan kesalahan kompilasi dari TextTemplate.exe dan paket itu (karena paket itu memanggil TextTemplate.exe) tetapi tidak dari Visual Studio. Jadi ternyata perilakunya tidak sama; kepala.

EDIT: Ini akhirnya menjadi masalah saya.


0

Inilah acara pra-bangun yang hanya menggunakan Microsoft Tooling dan jalur standar. Ini diuji di vs2019 / netcore3.1.

Ganti "AppDbContext.tt" dengan jalur file relatif proyek Anda:

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

Microsoft juga memiliki panduan untuk membuat makro seperti "$ (SolutionDirectory)" tersedia di templat dengan menggunakan T4ParameterValues dalam file proyek Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.