Guardando attraverso il codice sorgente da TextTransformation.exe (con ILSpy) non penso sia possibile senza modificare il modello (ma ho una soluzione).
In definitiva ciò che ci preoccupa qui è il passo durante l'analisi modello in cui Microsoft.VisualStudio.TextTemplating.Engine.ResolveAssemblyReferences() viene chiamato. Questo delega a ITextTemplatingEngineHost.ResolveAssemblyReference() (se lo fa espandere variabili ambiente prima)
Quando il modello viene eseguito dalla riga di comando, l'applicazione utilizzata è quella fornita dal CommandLineHost, e la sua attuazione semplicemente cerca il file come fornito nei percorsi di riferimento e nel GAC. Dato che a questo punto il nome del file avrà ancora il bit $ (SolutionPath), non avrà mai successo.
Si potrebbe implementare la propria versione di TextTransform.exe, ma che avrebbe dovuto iniziare in gran parte da zero (o usare riflessione), dal momento che è CommandLineHost :-(interna o si potrebbe sfruttare la porta Mono https://stackoverflow.com/a/1395377/26167
non posso dire che sono contento di questo, perché mi trovo nella stessa barca ...
Edit: Tuttavia ... dal momento che in ultima analisi, tutto quello che dovete fare è modificare il modello, Ho creato uno script PowerShell per copiare i modelli nella directory temporanea, espandendo manualmente il ma $ (SolutionDir) cro nel processo, ed eseguirli da lì. Quello sembra funzionare alla fine.
Goccia questo nel progetto incriminato (si potrebbe desiderare di cambiare l'estensione del file) e si dovrebbe essere pronti per partire:
<#
.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;
}
Hai provato 'set SolutionDir =% cd%' per impostare la variabile nella directory corrente? – Pawel
Questo non funziona, neanche -a !! $ (SolutionDir)! C: \ dev \ mysolutionroot – piers7
C'è una porta Mono di T4. Mi chiedo se la risposta sia nella base di codice da qualche parte. Vedi http://stackoverflow.com/a/1395377/26167 – piers7