Nhìn qua mã nguồn từ TextTransformation.exe (với ILSpy) Tôi không nghĩ rằng điều này là có thể mà không sửa đổi mẫu (nhưng tôi có một giải pháp).
Cuối cùng, những gì chúng tôi quan tâm ở đây là bước trong khi phân tích cú pháp mẫu trong đó Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences() được gọi. Đây đại biểu ITextTemplatingEngineHost.ResolveAssemblyReference() (mặc dù nó không mở rộng các biến môi trường đầu tiên)
Khi mẫu được chạy từ dòng lệnh, việc thực hiện đang được sử dụng được cung cấp bởi các CommandLineHost, và việc thực hiện đơn giản tìm kiếm tệp như được cung cấp trong đường dẫn tham chiếu và GAC. Với tên tập tin vào thời điểm này vẫn còn có bit $ (SolutionPath), nó sẽ không bao giờ thành công.
Bạn có thể thực hiện phiên bản riêng lại TextTransform.exe, nhưng bạn sẽ phải bắt đầu chủ yếu từ đầu (hoặc sử dụng phản ánh), vì CommandLineHost là :-(nội Hoặc bạn có khả năng có thể tận dụng các cổng Mono https://stackoverflow.com/a/1395377/26167
tôi không thể nói rằng tôi đang hạnh phúc về điều này, bởi vì tôi thấy mình trong cùng một thuyền ...
Edit: Tuy nhiên ... kể từ cuối cùng tất cả các bạn cần làm là thay đổi mẫu, Tôi đặt cùng một kịch bản PowerShell để sao chép các mẫu vào thư mục tạm thời, mở rộng thủ công $ (SolutionDir) ma cro trong quá trình, và thực hiện chúng từ đó. Điều đó dường như hoạt động chỉ tốt.
Drop này vào dự án vi phạm (bạn có thể muốn thay đổi phần mở rộng tập tin) và bạn sẽ được tốt để đi:
<#
.Synopsis
Executes all the T4 templates within designated areas of the containing project
.Description
Unfortunately the Visual Studio 2010 'Transform All Templates' function doesn't appear
to work in SSDT projects, so have to resort to hackery like this to bulk-execute templates
#>
param(
)
$ErrorActionPreference = 'stop';
$scriptDir = Split-Path $MyInvocation.MyCommand.Path
$commonProgramFiles32 = $env:CommmonProgramFiles
if (Test-Path environment::"CommonProgramFiles(x86)") { $commonProgramFiles32 = (gi "Env:CommonProgramFiles(x86)").Value };
$t4 = Resolve-Path "$commonProgramFiles32\Microsoft Shared\TextTemplating\10.0\texttransform.exe";
$solutionDir = Resolve-Path "$scriptDir\..\"
$templates = @(dir "$scriptDir\Database Objects\load\*.tt")
# Cloning to temp dir originally caused issues, because I use the file name in the template (doh!)
# Now I copy to temp dir under the same name
pushd $scriptDir;
try{
foreach($template in $templates){
$templateTemp = Join-Path ([IO.Path]::GetTempPath()) $template.Name;
$targetfile = [IO.Path]::ChangeExtension($template.FullName, '.sql');
Write-Host "Running $($template.Name)"
Write-Host "...output to $targetFile";
# When run from outside VisualStudio you can't use $(SolutionDir)
# ...so have to modify the template to get this to work...
# ...do this by cloning to a temp file, and running this instead
Get-Content $template.FullName | % {
$_.Replace('$(SolutionDir)',"$solutionDir")
} | Out-File -FilePath:$templateTemp
try{
& $t4 $templateTemp -out $targetfile -I $template.DirectoryName;
}finally{
if(Test-Path $templateTemp){ Remove-Item $templateTemp; }
}
}
}finally{
popd;
}
bạn đã cố gắng 'thiết SolutionDir =% cd% 'để đặt biến vào thư mục hiện? – Pawel
Điều đó không có tác dụng, không -a !! $ (SolutionDir)! C: \ dev \ mysolutionroot – piers7
Có một cổng Mono của T4. Tôi tự hỏi nếu câu trả lời là trong codebase một nơi nào đó. Xem http://stackoverflow.com/a/1395377/26167 – piers7