2011-02-10 27 views
16

Tôi đang sử dụng T4 trong Visual Studio 2010 và tôi muốn lặp lại các tệp trong giải pháp của mình, tuy nhiên tôi thấy rằng việc tạo nguồn T4 hoạt động theo kiểu hộp cát và hiện tại thư mục làm việc nằm bên trong thư mục Visual Studio 10 trong các tệp chương trình.T4 Lấy danh mục giải pháp hiện tại của giải pháp

Có cách nào để tham chiếu giải pháp tệp T4 có tương đối không, để nó không phá vỡ bản dựng, hoặc hoạt động trên hộp của người khác không có cùng cấu trúc tệp vv?

Cảm ơn

Trả lời

26

Bạn phải thiết lập các thuộc tính hostspecific true như vậy:

<#@ template language="C#" hostspecific="True" #> 

Giao diện ITextTemplatingEngineHost sẽ cung cấp cho bạn những thông tin bạn cần.

<#= this.Host.ResolveParameterValue("-", "-", "projects") #> 

Tôi không tin có cách để tham khảo giải pháp, nhưng bạn có thể lấy đường dẫn trong đó tệp *.tt của bạn và từ đó nhận các tệp khác.

Để tải một tập tin từ một vị trí tương đối so với các mẫu văn bản, bạn có thể sử dụng này:

this.Host.ResolvePath("relative/path.txt") 
+2

Cảm ơn Shiv! Tôi đã kết thúc bằng cách sử dụng này.Host.TemplateFile, mà điểm trực tiếp vào mẫu và chạy từ đó. – aceinthehole

+0

@aceinthehole, cảm ơn phản hồi! –

+2

Bạn có thể nhận Giải pháp trực tiếp bằng cách tải DTE: http://stackoverflow.com/questions/12952110/accessing-projects-via-dte-in-c-sharp-t4-template –

9

Đây là phương pháp tôi sử dụng để có được những thư mục cơ sở giải pháp:

public string GetSolutionDirectory() 
{ 
    var serviceProvider = this.Host as IServiceProvider; 
    var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; 
    return System.IO.Path.GetDirectoryName(dte.Solution.FullName); 
} 
4

Dưới đây là cách sử dụng logic JCallico được cung cấp trong mẫu T4 tạo tệp XML:

<#@ template debug="false" hostspecific="true" language="C#" #><# /* hostspecific must be set to "true" in order to access Visual Studio project properties. */ #> 
<#@ assembly name="System.Core" #> 
<#@ import namespace="System.Text" #> 
<#@ output extension=".xml" #> 
<#@ assembly name="EnvDTE" #><# /* This assembly provides access to Visual Studio project properties. */ #> 
<# 
    var serviceProvider = this.Host as IServiceProvider; 
    var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; 
    var solutionDirectory = System.IO.Path.GetDirectoryName(dte.Solution.FullName); 
#> 
<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <mySetting filePath="<#= solutionDirectory #>\MySubfolder\MyFile.exe" /> 
</configuration> 

XML att ribute "filePath" sẽ bằng thư mục giải pháp của Visual Studio cộng với "\ MySubfolder \ MyFile.exe".

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