2

나는 다음과 같은 명령 줄 TextTransform.exe을 사용하여 명령 행에서 T4 템플릿을 변환하려고 csproj 파일을 생성 추가하지 않습니다 :변형시키는 T4는 명령 줄에서

"%ProgramFiles(x86)%\Common Files\Microsoft Shared\TextTemplating\10.0\TextTransform.exe" .\MyProj\MyT4.cs -out을 -I"%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\Templates\Includes" -a!NamespaceHint!MyNameSpace -dpT4VSHost!Microsoft.Data.Entity.Design.VisualStudio.Directives.FallbackT4VSHostProcessor!"%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\Microsoft.Data.Entity.Design.dll" .\MyProj\MyT4.tt

결과 :

  1. 오류 메시지 완료에
  2. 은 % ERRORLEVEL %의은 0.
  3. 파일은 .csproj은 위의 명령 라인의 일부가 아닌 때문에 .csproj 그러나,

문제는이 예상되는 점 4입니다 변경되지 않습니다

  • 를 생성 받아 들일 수있는 매개 변수를 찾을 수 없습니다.

    무엇이 잘못 되었나요? 아니면 내가 무엇을해야합니까?

    P. Visual Studio에서 단추를 사용할 때 프로세스는 예외로 작동합니다 (새 파일이 프로젝트에 추가됨).

  • +0

    그냥 의견; 필자는 개인적으로 한 템플릿에서 많은 파일을 생성하는 것에 신경 쓰지 않습니다. 이 질문은 이유 중 하나입니다. 이제 당신을 둘러싼 요구 사항 때문에 선택하지 못할 수도 있지만 미래와 다른 사람들을 위해서 이것은 1 개의 템플릿에서 1 개의 파일 => 문제가 적은 것입니다. – FuleSnabel

    +0

    파일은 데이터베이스 데이터를 사용하여 생성되며 일반 데이터웨어 하우스를 강력한 유형의 도메인 기반 구조로 변환하는 데 사용됩니다. 이 파일의 수가 일정하지 않습니다. 출력 파일 유형마다 하나의 ttinclude 파일을 가지고 있습니다. 하나의 기본 ttinclude 파일은 모든 부분을 조정하고 tt 파일은 오케스트레이터 ttinclude 파일에 매개 변수를 전달합니다. –

    답변

    2

    는 다음과 같은 방법을 사용하여 해결 :

    -a!!ProjPath!.\MyProj\MyProj.csproj-a!!T4Path!.\MyProj\MyT4.tt

  • A를 include 디렉토리 매개 변수를 변경 :

    1. 라인을 명령 이러한 매개 변수를 추가를 로컬 경로 :

      -I".\Dependencies"

    2. (210)는 그 경로에 복사 EF.Utility.CS.ttinclude 다음과 같이 변경했다 :

    3.1.대체 :

    public static EntityFrameworkTemplateFileManager Create(object textTransformation) 
        { 
         DynamicTextTransformation transformation = DynamicTextTransformation.Create(textTransformation); 
         IDynamicHost host = transformation.Host; 
    
    #if !PREPROCESSED_TEMPLATE 
         if (host.AsIServiceProvider() != null) 
         { 
          return new VsEntityFrameworkTemplateFileManager(transformation); 
         } 
    #endif 
         return new EntityFrameworkTemplateFileManager(transformation); 
        } 
    

    public static EntityFrameworkTemplateFileManager Create(object textTransformation) 
        { 
         DynamicTextTransformation transformation = DynamicTextTransformation.Create(textTransformation); 
         IDynamicHost host = transformation.Host; 
    
    #if !PREPROCESSED_TEMPLATE 
         if (host.AsIServiceProvider() != null) 
         { 
          return new VsEntityFrameworkTemplateFileManager(transformation); 
         } 
    #endif 
         return new EFTemplateFileManagerPlus(transformation); 
        } 
    

    추가 파일에이 클래스를 추가 (최종 수익은 변화가) 사용

    private sealed class EFTemplateFileManagerPlus : EntityFrameworkTemplateFileManager 
    { 
         private Action<IEnumerable<string>> projectSyncAction; 
         private readonly string _projPath; 
         private readonly string _t4Name; 
    
         public EFTemplateFileManagerPlus(object textTemplating) 
          : base(textTemplating) 
         { 
          var projPath = _textTransformation.Host.ResolveParameterValue("", "", "ProjPath"); 
          var t4Path = _textTransformation.Host.ResolveParameterValue("", "", "T4Path"); 
          _projPath = System.IO.Path.GetFullPath(projPath); 
          _t4Name = System.IO.Path.GetFileName(t4Path); 
    
          projectSyncAction = files => SyncCsProjFile(_projPath, _t4Name, files); 
         } 
    
         public static void SyncCsProjFile(string csProjFilePath, string t4FileName, IEnumerable<string> files) 
         { 
          files = files.Select(f => System.IO.Path.GetFileName(f)).Distinct().ToList(); 
    
          var csProjDocument = new XmlDocument(); 
          csProjDocument.Load(csProjFilePath); 
    
          var root = csProjDocument.DocumentElement; 
    
          XmlElement itemGroup = root.ChildNodes.OfType<XmlElement>() 
           .Where(n => n.Name == "ItemGroup") 
           .SelectMany(n => n.ChildNodes.OfType<XmlNode>() 
            .Where(c => c.Name == "Compile") 
            ) 
           .Select(c => c.ParentNode) 
           .FirstOrDefault() as XmlElement; 
    
          if (itemGroup == null) 
          { 
           itemGroup = csProjDocument.CreateNode(XmlNodeType.Element, "ItemGroup", null) as XmlElement; 
           root.AppendChild(itemGroup); 
          } 
    
          var codeFiles = itemGroup.ChildNodes.OfType<XmlElement>() 
           .Where(c => 
            c.Name == "Compile" 
            && c.HasAttribute("Include") && !String.IsNullOrEmpty(c.GetAttribute("Include"))) 
           .ToList(); 
    
          var dependantFiles = codeFiles 
           .Where(f => 
            f.ChildNodes.OfType<XmlElement>().Any(c => 
             c.Name == "DependentUpon" 
             && c.InnerText == t4FileName) 
           ).ToList(); 
    
          // Remove redundant files 
          foreach (var node in dependantFiles) 
          { 
           if (!files.Contains(node.GetAttribute("Include"))) 
            itemGroup.RemoveChild(node); 
          } 
    
          // Add missing files 
          foreach (var name in files) 
          { 
           if (!dependantFiles.Any(node => node.GetAttribute("Include") == name)) 
           { 
            var node = csProjDocument.CreateNode(XmlNodeType.Element, "Compile", null) as XmlElement; 
            node.SetAttribute("Include", name); 
            itemGroup.AppendChild(node); 
    
            var node2 = csProjDocument.CreateNode(XmlNodeType.Element, "DependentUpon", null) as XmlElement; 
            node2.InnerText = t4FileName; 
            node.AppendChild(node2); 
           } 
          } 
    
          SaveClean(csProjDocument, csProjFilePath); 
         } 
    
         static private void SaveClean(XmlDocument doc, string path) 
         { 
          StringBuilder sb = new StringBuilder(); 
          XmlWriterSettings settings = new XmlWriterSettings(); 
          settings.Encoding = Encoding.UTF8; 
          settings.Indent = true; 
          settings.IndentChars = " "; 
          settings.NewLineChars = "\r\n"; 
          settings.NewLineHandling = NewLineHandling.Replace; 
          settings.NamespaceHandling = NamespaceHandling.OmitDuplicates; 
          using (XmlWriter writer = XmlWriter.Create(sb, settings)) 
          { 
           doc.Save(writer); 
          } 
    
          var newXml = sb.ToString().Replace("encoding=\"utf-16\"", "encoding=\"utf-8\"").Replace(" xmlns=\"\"", string.Empty); 
          System.IO.File.WriteAllText(path, newXml, Encoding.UTF8); 
         } 
    
         public override IEnumerable<string> Process(bool split) 
         { 
          var generatedFileNames = base.Process(split); 
    
          projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null)); 
    
          return generatedFileNames; 
         } 
        } 
    

    이제 프로젝트 파일 동기화 작동 TextTransform.exe도 있습니다.

  • 0

    저는 명령 행 호스트가 .csproj를 변경할 수 없다고 생각합니다. VS 호스트 만 DTE 개체에 대한 액세스를 통해이를 수행 할 수 있습니다.

    +0

    그래서 TextTransform.exe를 EnvDTE에 액세스하도록 구성 할 수 없습니까? 그런 경우 빌드 프로세스 중에 VS 호스트를 통해 변환에 액세스하는 방법은 무엇입니까? –