Sie können keine Literale in einer T4-Vorlage nach einem Scriptlet haben.
ändern
<#@ template debug="true" language="C#" #>
<#+
// scriptlet
#>
<-- empty line here
Um
<#@ template debug="true" language="C#" #>
<#+
// scriptlet
#>
Debuggen
können Sie die C# sehen von PreProcessTemplate
mit einem benutzerdefinierten Templating Host Aufruf durch die T4-Motor erzeugt wird.
I modifiziert, um die für diesen Zweck Custom Template Host sample:
using Microsoft.VisualStudio.TextTemplating;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace CustomHost
{
class CustomCmdLineHost : ITextTemplatingEngineHost
{
public string TemplateFile { get; private set; }
public string FileExtension { get; private set; }
public Encoding FileEncoding { get; private set; }
public CompilerErrorCollection Errors { get; private set; }
public IList<string> StandardAssemblyReferences { get { return new[] { typeof(System.Uri).Assembly.Location }; } }
public IList<string> StandardImports { get { return new string[] { "System" }; } }
public CustomCmdLineHost(string file)
{
this.TemplateFile = file;
this.FileEncoding = Encoding.UTF8;
this.FileExtension = ".txt";
}
public bool LoadIncludeText(string requestFileName, out string content, out string location)
{
content = location = String.Empty;
if (File.Exists(requestFileName))
{
content = File.ReadAllText(requestFileName);
return true;
}
return false;
}
public object GetHostOption(string optionName)
{
object returnObject;
switch (optionName)
{
case "CacheAssemblies":
returnObject = true;
break;
default:
returnObject = null;
break;
}
return returnObject;
}
public string ResolveAssemblyReference(string assemblyReference)
{
return ResolvePath(assemblyReference);
}
public Type ResolveDirectiveProcessor(string processorName)
{
throw new Exception("Directive Processor not found");
}
public string ResolvePath(string fileName)
{
if (File.Exists(fileName))
{
return fileName;
}
string candidate = Path.Combine(Path.GetDirectoryName(this.TemplateFile), fileName);
if (File.Exists(candidate))
{
return candidate;
}
return fileName;
}
public string ResolveParameterValue(string directiveId, string processorName, string parameterName)
{
return String.Empty;
}
public void SetFileExtension(string extension)
{
FileExtension = extension;
}
public void SetOutputEncoding(System.Text.Encoding encoding, bool fromOutputDirective)
{
FileEncoding = encoding;
}
public void LogErrors(CompilerErrorCollection errors)
{
Errors = errors;
}
public AppDomain ProvideTemplatingAppDomain(string content)
{
return AppDomain.CreateDomain("Generation App Domain");
}
}
class Program
{
static void Main(string[] args)
{
var templateFileName = args[0];
CustomCmdLineHost host = new CustomCmdLineHost(templateFileName);
Engine engine = new Engine();
string language;
string[] refs;
var output = engine.PreprocessTemplate(
// input file
File.ReadAllText(templateFileName), host,
"testClass", "testNamespace", out language, out refs);
string outputFileName = Path.Combine(
Path.GetDirectoryName(templateFileName),
templateFileName + ".generator.cs");
File.WriteAllText(outputFileName, output, host.FileEncoding);
foreach (CompilerError error in host.Errors)
Console.WriteLine(error.ToString());
Console.ReadLine();
}
}
}
den Transformator von der Schablone erzeugten Prüfungs Linien zeigten wie die folgende außerhalb des TransformText()
Methode. Anscheinend wurden alle Literale in den Quellvorlagen, die nach einem scriptlet (<#+ #>
) kamen, in die generierte Generatorklasse eingefügt.
#line 1 "C:\dev\ImmutableObjectGraph-master\2013\Demo\Fruit.tt"
this.Write("\n");
Durch Entfernen der Zeilenvorschubzeichen am Ende jeder Vorlagendatei wurde das Problem behoben.
Während unten Antwort ist richtig, wenn Sie GitHub verwenden, kann der folgende Artikel auch eine alternative Lösung erklären - https://www.teamdevelopmentforsitecore.com/Blog/t4-transform-file-problems-code-gen – woodyiii
@ Woodyiii, können Sie feststellen, dass das Hinzufügen des richtigen EOL-Spezifizierer zu '.gitattributes' Ihr Problem dauerhaft lösen wird. Wenn Sie Teammitglieder auf anderen Plattformen haben, können Sie sie manuell ändern. – Mitch