2011-04-07 40 views
22

Tôi có mẫu T4 có thể xuất nội dung được tối ưu hóa hoặc nội dung chuẩn dựa trên cờ. Hiện tại tôi đang thay đổi cờ theo cách thủ công dựa trên nhu cầu của mình.Xác định cấu hình giải pháp (gỡ lỗi/giải phóng) khi chạy mẫu T4

Điều tôi muốn làm là đặt cờ dựa trên Cấu hình giải pháp trong Visual Studio. Nếu được thiết lập để xây dựng trong chế độ Debug, tôi sẽ xuất nội dung chuẩn. Nếu được đặt ở chế độ Phát hành, tôi sẽ tối ưu hóa nội dung thay thế. Tôi tìm thấy một câu hỏi T4 trông đầy hứa hẹn: T4 Text Template - Is it possible to get compilation symbols from host?

Tuy nhiên, trong trường hợp của tôi, tôi muốn làm một cái gì đó như sau:

<#@ template language="C#" hostspecific="True" 
    compilerOptions="/d:$(ConfigurationName)" #> 

Kể từ khi tôi có thể sử dụng $ (SolutionDir) trong một chỉ thị lắp ráp:

<#@ assembly name="$(SolutionDir)\myreference.dll" #> 

tôi sẽ nghĩ rằng/d: $ (ConfigurationName) sẽ làm cho tôi nơi tôi cần phải đi, và sau đó tôi có thể làm như sau để thiết lập cờ của tôi:

<# 
#if Debug 
optimize = false; 
#else 
optimize = true; 
#endif 
#> 

Than ôi, điều này dường như không hoạt động. Tôi cũng đã cố gắng sử dụng:

Host.ResolveParameterValue("-", "-", "ConfigurationName"); 

Cũng không có kết quả. Bất kỳ ý tưởng?

Trả lời

22

Không sớm hơn tôi hỏi nhưng tôi tìm thấy một đoạn mã ở dưới cùng của this MSDN article giúp tôi có được vị trí cần thiết. Câu trả lời ở đây là sử dụng giao diện IServiceProvider để có được Visual Studio DTE. Dưới đây là mã mà là nhận được nó thực hiện (xin lỗi trước cho "Debug" hard-coded):

var serviceProvider = Host as IServiceProvider; 
var dte = serviceProvider.GetService(typeof(DTE)) as DTE; 
var configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name ; 
optimize = (configName != "Debug"); 

CẬP NHẬT

Mã này sẽ kiểm tra xem cấu hình hiện tại các hoạt động của dự án có tối ưu hóa trên. Nó vẫn có một tên thuộc tính được mã hóa cứng, nhưng nó ít có khả năng thay đổi. Ngoài ra, sử dụng cờ tối ưu hóa của dự án làm cho rất nhiều ý nghĩa cho kịch bản của tôi (cố gắng để quyết định xem tôi nên bật tối ưu hóa trong mã của riêng tôi):

var serviceProvider = Host as IServiceProvider; 
var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as DTE; 
config = dte.Solution 
      .FindProjectItem(Host.TemplateFile) 
      .ContainingProject 
      .ConfigurationManager 
      .ActiveConfiguration; 
foreach(Property prop in config.Properties){ 
    if (prop.Name == "Optimize"){ 
     optimize = (bool)prop.Value; 
     break; 
    } 
} 
+0

Có trang cho lớp DTE trong tài liệu MSDN không? Tôi đã tìm kiếm nó và gặp khó khăn trong việc tìm kiếm nó. – rstackhouse

+0

Nevermind. Tôi nghĩ rằng tôi chỉ tìm thấy nó: http://msdn.microsoft.com/en-us/library/vstudio/EnvDTE(v=vs.100).aspx – rstackhouse

+0

SDTE? Đó có phải là lỗi đánh máy không? –

9

Đối với những người cố gắng để có được công việc này ở thời gian thiết kế (lưu tệp) cũng như at build-time (F5/F6), hai phương pháp là cần thiết.

Emil mô tả phương pháp thiết kế thời gian. Đối với xây dựng thời gian, trước tiên bạn phải xác định một tham số T4 trong hồ sơ dự án của bạn:

<ItemGroup> 
    <T4ParameterValues Include="BuildConfiguration"> 
    <Value>$(Configuration)</Value> 
    <Visible>false</Visible>  
    </T4ParameterValues> 
</ItemGroup> 

Sau đó, bạn phải tham khảo nó ở phía trên cùng của .tt của bạn:

<#@ parameter type="System.String" name="BuildConfiguration" #> 

Và sau đó tìm kiếm bất kỳ cái nào trong số chúng sẽ được cung cấp:

string configurationName = Host.ResolveParameterValue("-", "-", "BuildConfiguration"); 
if (string.IsNullOrWhiteSpace(configurationName)) 
{ 
    var serviceProvider = (IServiceProvider)Host; 
    var dte = (DTE)serviceProvider.GetService(typeof(DTE)); 
    configurationName = dte.Solution.SolutionBuild.ActiveConfiguration.Name; 
} 

Cần phải bao gồm logic cho cả hai nếu bạn muốn mẫu của bạn hoạt động trong cả hai trường hợp. Phương thức thiết kế thời gian không hoạt động ở thời gian xây dựng (Máy chủ DTE không xung quanh để cung cấp Giải pháp) và phương pháp xây dựng không hoạt động ở thời gian thiết kế (MSBuild không xung quanh để cung cấp tham số).

Các vấn đề liên quan