Nhận Visual Studio để chạy Mẫu T4 trên mỗi bản dựng


163

Làm cách nào để có được mẫu T4 để tạo đầu ra của nó trên mỗi bản dựng? Như bây giờ, nó chỉ tạo lại nó khi tôi thay đổi mẫu.

Tôi đã tìm thấy những câu hỏi khác tương tự như thế này:

Thứ tự chuyển đổi và xây dựng T4 trong Visual Studio (chưa được trả lời)

Làm thế nào để có được các tập tin t4 để xây dựng trong phòng thu trực quan? (câu trả lời không đủ chi tiết [trong khi vẫn còn nhiều phức tạp] và thậm chí không có ý nghĩa tổng thể)

Phải có một cách đơn giản hơn để làm điều này!


Trong khi cá nhân tôi khá thích thú khi nghe câu trả lời cho vấn đề này, kịch bản cụ thể của bạn là gì? Thông thường đầu ra của mẫu chỉ là một chức năng của đầu vào, do đó, việc tạo thay đổi là tốt.
Pavel Minaev

6
Mẫu của tôi sử dụng sự phản chiếu để kiểm tra các hội đồng khác, có thể đã thay đổi kể từ lần xây dựng trước.
JoelFan

Ý tưởng này là gì: stackoverflow.com/questions/1649649/
Kẻ

Mẫu của tôi phục vụ một mục đích, ghi lại thời gian ngày xây dựng.
Scott Solmer

Câu trả lời:


68

Tôi đã sử dụng câu trả lời của JoelFan để đưa ra câu hỏi này. Tôi thích nó hơn vì bạn không phải nhớ sửa đổi sự kiện dựng sẵn mỗi khi bạn thêm tệp .tt mới vào dự án.

  • thêm TextTransform.exe vào %PATH%
  • đã tạo một tệp bó có tên Transform_all.bat (xem bên dưới)
  • tạo sự kiện xây dựng trước " transform_all ..\.."

biến đổi_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
Giải pháp tốt đẹp. Tôi thích đặt đường dẫn đầy đủ tới TextTransform.exe ( "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe") trong tệp bó, thay vì thêm nó vào% PATH%
Adam Nofsinger

20
Một biến tốt hơn sẽ là% COMMONPROGRAMFILES (x86)% thay vì% COMMONPROGRAMFILES% vì nó cũng sẽ hoạt động trên hệ thống 64 bit.
Durden81

3
Vì vậy, con đường đầy đủ sẽ được %COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe. Gói nó trong dấu ngoặc kép.
Northben

1
@ piers7: Tôi đã cập nhật mã để tự động phát hiện 'bitness' của HĐH đang chạy tập lệnh. Tôi cũng đã đưa vào nhận xét của Northben để bỏ qua thư mục obj và triển khai tùy chọn của Adam Nofsinger về việc không sửa đổi biến môi trường% PATH%.
Alex Essilfie

1
IMHO phải cung cấp đường dẫn đến TextTransform.exehút. Bạn đã có thể nhấp chuột phải vào "Chạy công cụ tùy chỉnh" trong Visual Studio, vì vậy nó đã có đường dẫn của công cụ. Tại sao tôi phải trải qua công việc cung cấp lại khi tôi xây dựng từ bối cảnh Visual Studio?
Jez

70

Tôi đồng ý với GarethJ - trong VS2010, việc tạo lại các mẫu tt trên mỗi bản dựng sẽ dễ dàng hơn nhiều. Blog của Oleg Sych mô tả cách thực hiện. Nói ngắn gọn:

  1. Cài đặt Visual Studio SDK
  2. Cài đặt SDK trực quan hóa và mô hình hóa Visual Studio 2010
  3. Mở trong tệp dự án soạn thảo văn bản và thêm vào cuối tệp nhưng trước đó </Project>

Đó là nó. Mở dự án của bạn. Trên mỗi bản dựng, tất cả các mẫu * .tt sẽ được xử lý lại

<!-- 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
Đây là một liên kết đến bài đăng trên blog của Oleg Sych: olegologists.com/2010/04/under Hiểu
t4

4
Đây là một giải pháp rất tốt đẹp. Tuy nhiên, có cách nào để làm việc này mà không yêu cầu cài đặt SDK không? Tôi đã cố gắng làm cho nó hoạt động bằng cách sao chép các tệp .target và các hội đồng liên quan, nhưng không thành công.
grimus

3
Chirpy dường như hoạt động mà không phải tải xuống bất kỳ SDK nào ... tuy nhiên, bạn vẫn phải tải xuống và định cấu hình Chirpy. Tôi vẫn đang cố gắng khám phá một giải pháp hoạt động trên bản cài đặt mặc định của VS2010 và sẽ có sẵn thông qua kho lưu trữ nguồn để các nhà phát triển chỉ cần kiểm tra repo để nó hoạt động. Tất cả những giải pháp khác này đòi hỏi quá nhiều sự chú ý của mỗi nhà phát triển.
Mir

1
Nếu bạn xây dựng các dự án của mình bằng phiên bản x64 của MSBuild - bạn sẽ gặp lỗi này: 'MSB4019: Dự án đã nhập "C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating.t Target " không tìm thấy.' lỗi. Giải pháp thay thế - thay thế biến $ (MSBuildExtensionsPath) bằng $ (MSBuildExtensionsPath32) trong tệp dự án.
Rỉ

3
Hơn nữa, bạn không cần phải vá các tệp .csproj. Từ dòng lệnh gọi một cái gì đó như 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

Có một gói NuGet tuyệt vời thực hiện điều này:

PM> Install-Package Clarius.TransformOnBuild

Chi tiết về gói có thể được tìm thấy ở đây


2
Có một ngã ba 'không chính thức': nuget.org/packages/Clarius.TransformOnBuild-unofficial hỗ trợ contentcác hành động xây dựng
Erno

1
Đó là tiện ích mở rộng tuyệt vời nhưng nó đang chạy TextTransform.exe ở chế độ CommandLine , do đó, các chức năng của hostspecific = "true" sẽ không hoạt động
Gh61

1
@JenishRabadiya Thêm dòng này vào đầu mẫu:<#@ template language="C#" #>
Peter van Kekem

2
Có vẻ như gói đã được cập nhật để hỗ trợ hostspecific = "true" và các vấn đề khác (8 ngày trước)
Mingwei Samuel

1
Hành động xây dựng nội dung hiện đang hoạt động với phiên bản mới nhất.
androbin

20

Tôi đã sử dụng câu trả lời của MarkGr và phát triển giải pháp này. Đầu tiên, tạo một tệp bó có tên RunTemplate.bat trong một thư mục công cụ riêng phía trên thư mục giải pháp chính. Tệp bó chỉ có dòng:

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

Tệp bó này có 2 tham số ... % 1 là đường dẫn đến tệp .tt không có phần mở rộng .tt. % 2 là đường dẫn đến bất kỳ DLL nào được gọi bởi chỉ thị hội trong mẫu.

Tiếp theo, đi vào Thuộc tính dự án của dự án chứa mẫu T4. Đi vào Build Events và thêm dòng lệnh sự kiện Pre-build sau đây :

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

thay thế MyTemplate bằng tên tệp của tệp .tt của bạn (ví dụ MyTemplate.tt) mà không có phần mở rộng .tt. Điều này sẽ có kết quả của việc mở rộng mẫu để tạo MyTemplate.cs trước khi xây dựng dự án. Sau đó, bản dựng thực tế sẽ biên dịch MyTemplate.cs


mặc dù tôi vẫn gặp sự cố: stackoverflow.com/questions/1669893/
Kẻ

1
Đừng quên các trích dẫn quanh $ (SolutionDir) .. \ .. \ tools \ RunTemplate.bat
Ewald Hofman

14

Gần đây đã tìm thấy plugin VS tuyệt vời này, Chirpy .

Nó không chỉ tạo T4 của bạn trên bản dựng mà còn cho phép tiếp cận dựa trên T4 để thu nhỏ javascript, CSS và thậm chí cho phép bạn sử dụng cú pháp LESS cho CSS của mình!


13

Có lẽ cách đơn giản nhất là cài đặt tiện ích mở rộng Visual Studio có tên AutoT4 .

Nó chạy tất cả các mẫu T4 trên bản dựng tự động.


Đã đồng ý! Có thể định cấu hình và hoạt động với VS 2015. Nó thậm chí còn hỗ trợ sử dụng lắp ráp EnvDTE (để lấy cấu hình xây dựng), điều mà không phải phương pháp nào cũng làm được. Nhược điểm duy nhất là tất cả các thành viên trong nhóm phải cài đặt tiện ích mở rộng.
Gyromite

12

Việc xây dựng trước có thể được giảm xuống thành một dòng duy nhất:

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

Điều này biến đổi tất cả .tt các tệp trong dự án và liệt kê chúng vào đầu ra bản dựng.

Nếu bạn không muốn đầu ra của bản dựng thì bạn phải xử lý một số "hành vi thú vị" :

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

Tất nhiên, bạn có thể kéo tệp này thành một tệp bó mà bạn vượt qua đường dẫn thư mục dự án nếu muốn.

NB Đường dẫn có thể yêu cầu một số điều chỉnh. Đường dẫn ở trên là nơi VS 2008 cài đặt nó trên máy của tôi; nhưng bạn có thể thấy rằng số phiên bản giữa TextTemplatingTextTransform.exekhác nhau.


@SprintStar, nếu bạn có VS 2012, có lẽ cách tốt hơn để làm điều đó. Các câu trả lời khác nói về những cách tốt hơn đã có cho VS 2010
Peter Taylor

Đây là phương pháp tốt nhất, vì tôi không phải cài đặt bất cứ thứ gì.
Ryan Gates

1
Tôi thấy không có 1.2 nhưng đã có 12.0 nên đã đổi nó thành lỗi đó nhưng đã gặp lỗi này:System.Exception: T4MVC can only execute through the Visual Studio host
colmde 15/03/2016

1
Chỉ cần cập nhật đường dẫn thư mục để sử dụng 14.0 thay vì 1.2 và tốt để đi.
pistol-pete

Đây là giải pháp tốt nhất theo quan điểm của tôi (chỉ thay đổi 14.0 như đã đề cập ở trên)
Nelson Rodriguez

9

Kiểm tra C: \ Program Files (x86) \ Common Files \ Microsoft Shared \ TextTemplating có một chuyển đổi dòng lệnh exe trong đó. Hoặc viết một tác vụ MSBuild với một máy chủ tùy chỉnh và tự thực hiện chuyển đổi.


1
Ồ, mặc dù bạn có thể làm những thứ như "devenv / Command TextTransatures.Transform ALLTemsheet / Command File.Exit MySolution.sln" vào năm 2010, nó có xu hướng bị hỏng trên máy chủ xây dựng. Đặt cược tốt nhất của bạn là viết một tác vụ MSBuild với một máy chủ tùy chỉnh.
MarkGr

Đối với các bản dựng trên máy tính để bàn, chỉ cần tạo một macro thực hiện TransformAllTemsheet và sau đó là bản dựng.
MarkGr

7

Mở rộng câu trả lời của Seth RenoJoelFan , tôi đã nghĩ ra điều này. Với giải pháp này, bạn không cần nhớ sửa đổi sự kiện dựng sẵn mỗi khi bạn thêm tệp .tt mới vào dự án.

Thủ tục thực hiện

  • Tạo một tệp bó có tên Transform_all.bat (xem bên dưới)
  • Tạo sự kiện xây dựng trước transform_all.bat "$(ProjectDir)" $(ProjectExt)cho từng dự án với .tt bạn muốn xây dựng

biến đổi_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


GHI CHÚ

  1. Chuyển đổi văn bản giả định mã trong mẫu T4 có cùng ngôn ngữ với loại dự án của bạn. Nếu trường hợp này không áp dụng cho bạn, thì bạn sẽ phải thay thế $(ProjectExt)đối số bằng phần mở rộng của các tệp bạn muốn tạo mã.

  2. .TTcác tập tin phải nằm trong thư mục dự án mà chúng sẽ không xây dựng. Bạn có thể xây dựng các tệp TT bên ngoài thư mục dự án bằng cách chỉ định một đường dẫn khác làm đối số đầu tiên ( nghĩa là thay thế "$(ProjectDir)"bằng đường dẫn chứa các tệp TT.)

  3. Cũng nhớ để đặt đường dẫn chính xác đến transform_all.battệp bó.
    Ví dụ, tôi đã đặt nó trong thư mục giải pháp của mình để sự kiện tiền xây dựng như sau"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)


Tôi đang cố gắng sử dụng phương pháp này, nhưng tôi liên tục gặp lỗi, với '\ Common là bất ngờ tại thời điểm này.' trong đầu ra của tôi. Nó xảy ra ngay tại dòng này: for / f "delims =" %% d in (t4list.txt) làm ... Bạn có biết tôi đang thiếu gì không?
Michael Lewis

@MichaelLewis: Tôi đã xem qua tệp bó nhiều lần mà không phát hiện ra điều gì có thể gây ra lỗi. Vui lòng thử phương pháp do Seth Reno đề xuất để xem liệu nó có tạo ra lỗi tương tự không. Trong lúc này, bạn có thể vui lòng gửi t4list.txttệp của mình lên PasteBin không để tôi thử xem lỗi của bạn có đến từ đó không?
Alex Essilfie

Tôi đã thử cách tiếp cận của Seth với cùng một vấn đề ('\ Phổ biến là bất ngờ tại thời điểm này'). Tôi không thể đăng tệp t4list.txt do các hạn chế của công ty, nhưng nó bao gồm một dòng và \ Common không xuất hiện trong đường dẫn.
Michael Lewis

@MichaelLewis: Thật không may, nếu lỗi của bạn xảy ra for /f "delims=" %%d in (t4list.txt) do (và các hạn chế của công ty ngăn bạn đăng t4list.txttệp của bạn , thì tôi e rằng tôi không thể làm gì nhiều để giúp bạn. Tôi đã thực sự muốn giúp giải quyết vấn đề này nhưng có vẻ như điều đó là không thể vì tôi không có dữ liệu để tiếp tục. Chúc may mắn trong việc khắc phục vấn đề và vui lòng nhớ đăng giải pháp của bạn khi bạn thành công.
Alex Essilfie

Có thể làm tương tự khi tt chứa (this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;? Thật không may, tôi nhận được ngoại lệ tham chiếu null , khi tôi chạy tt từ không phải trong phòng thu trực quan.
Andrey K.

6

Nếu bạn đang sử dụng Visual Studio 2010, bạn có thể sử dụng SDK Visualization Modelling và Visualization: http://code.msdn.microsoft.com/vsvmsdk

Điều này chứa các tác vụ msbuild để thực thi các mẫu T4 khi xây dựng.

Hãy xem blog của Oleg để được giải thích thêm: http : //www.olegologists.com/2010/04/under Hiểu-t4-msbuild-integration


4

Hey, tập lệnh của tôi cũng có thể phân tích cú pháp mở rộng đầu ra

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%

Chỉ cần tạo transform_all.bat $(SolutionDir)sự kiện xây dựng trước và tất cả các tệp * .tt trong giải pháp của bạn sẽ được tự động chuyển đổi.


3

Dynamo.AutoTT sẽ làm những gì bạn cần. Bạn có thể cấu hình nó để xem các tập tin thông qua regex hoặc tạo khi xây dựng. Nó cũng cho phép bạn chỉ định mẫu T4 nào bạn muốn kích hoạt.

Bạn có thể tải xuống từ đây: https://github.com/MartinF/DOUNDo.AutoTT

Chỉ cần xây dựng nó, sao chép các tập tin dll và AddIn vào

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

và đi em đi.

Nếu bạn muốn nó hoạt động trong VS2012, bạn sẽ cần sửa đổi tệp Dynamo.AutoTT.AddIn và đặt Phiên bản thành 11.0 bên trong tệp AddIn;


3

Cảm ơn GitHub.com/Mono/T4 , tại thời điểm này, bạn có thể làm điều đó cho cả bản dựng .NET Core và Visual Studio bằng cách thêm phần này vào .csprojtệp của mình :

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

Nếu bạn chuyển đổi các mẫu của mình sang các ngôn ngữ lập trình khác nhau, bạn nên thêm một số thứ như <Compile Remove="**\*.vb" /><Compile Include="**\*.vb" /> để các tệp này được biên dịch ngay cả khi bạn chưa tạo tệp.

RemoveIncludethủ thuật chỉ cần thiết cho lần tạo đầu tiên hoặc bạn có thể làm cho XML ngắn hơn như thế này:

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

và chỉ chạy build hai lần (lần đầu tiên). Nếu bạn đã tạo các tệp đã cam kết với kho lưu trữ, sẽ không có vấn đề gì khi xây dựng lại với cả hai ví dụ.

Trong Visual Studio, bạn có thể muốn thấy một cái gì đó như thế này:

nhập mô tả hình ảnh ở đây

thay vì điều này:

nhập mô tả hình ảnh ở đây

Vì vậy, thêm một cái gì đó như thế này vào tập tin dự án của bạn:

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

Ví dụ đầy đủ ở đây: GitHub.com/Konard/T4GenericsExample (bao gồm việc tạo nhiều tệp từ mẫu đơn).


1

Đây là giải pháp của tôi - tương tự như câu trả lời được chấp nhận. Chúng tôi đã có một vấn đề với kiểm soát nguồn của chúng tôi. Các tệp .cs đích chỉ đọc và T4 không thành công. Đây là mã, chạy T4 trong thư mục tạm thời, so sánh các tệp mục tiêu và chỉ sao chép nó trong trường hợp có cùng một thay đổi. Nó không khắc phục vấn đề với các tệp read.only, nhưng ít nhất nó không xảy ra rất thường xuyên:

Biến đổi

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

Bạn có thể thử thêm lệnh thanh toán trên một dòng (:: Bạn có thể thử ....)

Trong dự án của bạn, thiết lập này là một hành động dựng sẵn:

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

1

Bạn chỉ cần thêm lệnh này vào sự kiện xây dựng trước của dự án:

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

Kiểm tra cấu hình = gỡ lỗi, đảm bảo rằng bạn không tạo lại mã trong chế độ phát hành, khi bạn thực hiện việc xây dựng trên máy chủ xây dựng TFS chẳng hạn.


Đẹp nhưng biến đổi tất cả có thể nguy hiểm nếu T4MVC không chỉ là tt trong dự án và chúng tôi không muốn chạy tất cả ...
Landeeyo

3
Tôi không có TextTemplating trong thư mục v11.0. Bạn lấy cái đó từ đâu?
Zack

1

Trong visual studio 2013, nhấp chuột phải vào mẫu T4 và đặt biến đổi trên thuộc tính build thành true.


1
Tôi không thể tìm thấy tùy chọn này trên menu chuột phải, tuy nhiên theo MSDN, có thể thực hiện bằng cách chỉnh sửa tệp dự án trong VS 2012 và 2013, xem msdn.microsoft.com/en-us/l Library / ee847423. aspx hoặc msdn.microsoft.com/en-us/l
Library / vstudio / ee847423.aspx

Đây dường như là một tùy chọn chỉ đi kèm với các công cụ T4 hữu hình, không mặc định trong Visual Studio.
Matt DiTrolio

Vâng, đây chỉ là phiên bản pro của T4 Toolbox.
Đại lộ

1

Đây là cách tôi giải quyết nó. Liên kết . Về cơ bản xây dựng trên đầu một blog tuyệt vời (blog.clariusconsulting.net/kzu/how-to-transform-t4-temsheet-on-build-without-installing-a-visual-studio-sdk/ không thể đăng thêm 2 links :() Tôi đã đưa ra mục tiêu này . tệp để sử dụng với các tệp proj trực quan.

Nó hữu ích khi bạn đang sử dụng các dll-s khác bên trong .tt của mình và bạn muốn kết quả thay đổi khi dll-s đang thay đổi.

Làm thế nào nó hoạt động:

  1. Tạo tt, thêm đường dẫn tên tập hợp = "$ (SolutionDir) \ vào \ other \ project \ output \ foo.dll và thiết lập chuyển đổi và kết quả như mong đợi
  2. Xóa tham chiếu lắp ráp khỏi .tt

  3. Bên trong tệp proj sử dụng mã này để thiết lập chuyển đổi trên bản dựng:

    <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>
    • Phần đầu tiên Định vị TextTransform.exe

    • $(IncludeForTransform)sẽ bằng c:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dllvì đó là cách để thêm các tham chiếu cho TextTransform trên dòng lệnh

       <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" />điều này tạo ra một danh sách tất cả các tệp tt bên trong dự án và thư mục con

    • <Exec Command="... tạo một dòng cho mỗi tệp .tt được tìm thấy trông giống như "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. Điều duy nhất còn lại phải làm là thêm các đường dẫn đến các dll bên trong:

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

    Ở đây <InProject>False</InProject>ẩn các mục này khỏi Chế độ xem Giải pháp

Vì vậy, bây giờ bạn sẽ có thể tạo mã của mình khi xây dựng và thay đổi dll-s.

Bạn có thể xóa công cụ tùy chỉnh (từ các thuộc tính bên trong Visual Studio) để VS không cố gắng chuyển đổi và thất bại thảm hại mỗi lần. Bởi vì chúng tôi đã xóa các tham chiếu lắp ráp trong bước 2


Vui lòng thêm giải pháp vào câu trả lời của bạn để cung cấp thêm ngữ cảnh. Liên kết không có giải pháp cho câu hỏi và có thể bị chết khi những người dùng khác quay lại câu hỏi này sau đó.
Frank van Wijk

1

T4Executer thực hiện điều này cho VS2019. Bạn có thể chỉ định các mẫu để bỏ qua khi xây dựng và có một thực thi sau tùy chọn xây dựng.


1

Bạn chỉ cần cài đặt Gói NuGet : Clarius.TransformOnBuild

Sau đó, mỗi khi bạn nhấp vào Xây dựng lại dự án (hoặc Giải pháp), các tệp .tt của bạn sẽ chạy


1

Trong Visual Studio 2017 (có lẽ cũng là phiên bản tiếp theo), bạn nên thêm phần này vào sự kiện Pre-build:

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

ps Thay đổi đường dẫn đến mẫu của bạn nếu nó không nằm trong thư mục gốc của dự án.


0

Một số anh chàng đã xây dựng một gói nuget cho việc này.

Lưu ý bên lề: Tôi nhận được các lỗi biên dịch từ cả TextTemplate.exe và gói đó (vì gói đó gọi TextTemplate.exe) nhưng không phải từ Visual Studio. Vì vậy, rõ ràng hành vi không giống nhau; đứng lên.

EDIT: Đây là vấn đề của tôi.


0

Đây là một sự kiện xây dựng trước chỉ sử dụng Microsoft Tooling và các đường dẫn tiêu chuẩn. Nó đã được thử nghiệm trong vs2019 / netcore3.1.

Thay thế "AppDbContext.tt" bằng đường dẫn tệp liên quan đến dự án của bạn:

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

Microsoft cũng có một hướng dẫn để tạo các macro như "$ (SolutionDirectory)" có sẵn trong mẫu bằng cách sử dụng T4ParameterValues trong tệp dự án của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.