Przeglądanie kodu źródłowego z TextTransformation.exe (z ILSpy) Nie sądzę, że jest to możliwe bez modyfikacji szablonu (ale mam rozwiązanie).
Ostatecznie co dbamy o tutaj jest krokiem podczas parsowania szablonu gdzie Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences() nazywa. Ten delegatów ITextTemplatingEngineHost.ResolveAssemblyReference() (chociaż to robi pierwsze zmienne środowiskowe)
Gdy szablon jest uruchamiany z linii poleceń, realizacja używany, że dostarczone przez CommandLineHost, a jego realizacja po prostu szuka pliku w postaci dostarczonej w ścieżkach referencyjnych i GAC. Biorąc pod uwagę, że nazwa pliku będzie nadal zawierać bit $ (SolutionPath), nigdy się to nie uda.
Można zaimplementować własne wersję TextTransform.exe, ale trzeba by zacząć w dużej mierze od zera (lub użyć refleksji), ponieważ CommandLineHost jest wewnętrzny :-(Albo można potencjalnie wykorzystać port Mono https://stackoverflow.com/a/1395377/26167
nie mogę powiedzieć, że jestem zadowolony z tego, bo znajdę się w tej samej łodzi ...
Edit: jednak ... ponieważ ostatecznie wszystko, co trzeba zrobić, to zmienić szablon, Przygotowałem skrypt PowerShell do skopiowania szablonów do katalogu temp, ręcznie rozszerzając $ (SolutionDir) ma cro w tym procesie, i wykonuj je stamtąd. To wydaje się działać po prostu dobrze.
Kropla to do projektu naruszającego (może chcesz zmienić rozszerzenie pliku) i powinno być dobrze 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;
}
Możesz próbowano ustawić SolutionDir '=% CD%' ustawić zmienną do bieżącego katalogu? – Pawel
To nie działa, nie ma również -a !! $ (SolutionDir)! C: \ dev \ mysolutionroot – piers7
Istnieje jeden port Mono T4. Zastanawiam się, czy odpowiedź jest gdzieś w bazie kodu. Zobacz http://stackoverflow.com/a/1395377/26167 – piers7