2017-10-20 267 views
1

我试图按照Microsoft的文档Code Generation in a Build Process中的说明重新生成我们的生成服务器上的T4模板。当 我建,模板生成与错误而失败(完整的MSBuild输出 是后面这个问题):FileNotFoundException当从生成服务器预处理T4模板

错误MSB4018:在“TransformTemplates”任务意外失败。

错误MSB4018:System.IO.FileNotFoundException:未能加载文件或 组件 'Microsoft.VisualStudio.TextTemplating.14.0,版本= 14.0.0.0, 文化=中性公钥= b03f5f7f11d50a3a' 或它的一个依赖。 系统找不到指定的文件。

我创建了a minimal project that reproduces the problem。脚本 build.cmd只是执行MSBuild。当我从我的 工作站运行build.cmd时,构建成功。它只在构建服务器上失败。

事情我已经尝试:

  • 复制的MSBuild和Visual Studio程序集的构建服务器,由代码生成文件规定 。

  • 将Visual Studio程序集添加到GAC。

  • 设置VSSDK140Install环境变量设置为 “C:\ Program Files文件 (x86)的\微软的Visual Studio 14.0 \ VSSDK \”(因为这是它是如何设置 我的工作站上)。

  • 设置HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0!InstallDirC:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\

我试图避免安装Visual Studio 2015年,因为这是一个相当 大的依赖性添加到我们构建服务器和微软的文档 明确地说,这应该是可能的。

复制组件到C:\ Program Files文件(x86)的

我已经复制下列文件到构建服务器,如代码 代文件规定(这些都是在Program Files文件(86)文件夹,因为 那就是他们都是我的机器在哪里):

  • $(PROGRAMFILES)\的MSBuild \微软\ VisualStudio的\ v * .0 \ TextTemplating
    • Microsoft.VisualStudio.TextTemplating.Sdk.Host.14.0.dll
    • Microsoft.TextTemplating.Build.Tasks.dll
    • Microsoft.TextTemplating。目标
  • $(PROGRAMFILES)\微软的Visual Studio 14.0 \ VSSDK \ VisualStudioIntegration \ COMMON \组件\ V4.0
    • Microsoft.VisualStudio.TextTemplating.14.0.dll
    • Microsoft.VisualStudio.TextTemplating .Interfaces.14.0.dll(几个文件)
    • Microsoft.VisualStudio.TextTemplating.VSHost.14.0.dll
  • $(PROGRAMFILES)\微软的Visual Studio 14.0 \ Common7 \ IDE \酒吧licAssemblies \
    • Microsoft.VisualStudio.TextTemplating.Modeling.14.0.dll

添加到GAC

我看到它的失败试图加载 Microsoft.VisualStudio.TextTemplating.14.0.dll,并自该组装在 我的工作站上的GAC我猜可能这是必需的,所以我尝试使用 GAC ManagerMicrosoft.VisualStudio.TextTemplating.14.0.dll添加到GAC,但是错误是 相同。

完整的MSBuild输出

当我运行build.cmd,我得到下面的输出:

D:\TTTest>"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" ClassLibrary1.sln /t:Rebuild 
Microsoft (R) Build Engine version 14.0.25420.1 
Copyright (C) Microsoft Corporation. All rights reserved. 

Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch. 
Build started 10/20/2017 11:05:16 AM. 
Project "D:\TTTest\ClassLibrary1.sln" on node 1 (Rebuild target(s)). 
ValidateSolutionConfiguration: 
    Building solution configuration "Debug|Any CPU". 
Project "D:\TTTest\ClassLibrary1.sln" (1) is building "D:\TTTest\ClassLibrary1\ClassLibrary1.csproj" (2) on node 1 (Rebuild target(s)). 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: The "TransformTemplates" task failed unexpectedly. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.VisualStudio.TextTemplating.14.0, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: File name: 'Microsoft.VisualStudio.TextTemplating.14.0, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: at Microsoft.VisualStudio.TextTemplating.Sdk.Host.GenericTextTemplatingHost..ctor(IServiceProvider serviceProvider) [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: at Microsoft.VisualStudio.TextTemplating.Build.Tasks.TransformTemplatesBase.GetConfiguredTextTemplatingHost() [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: at Microsoft.VisualStudio.TextTemplating.Build.Tasks.TransformTemplatesBase.Execute() [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: === Pre-bind state information === [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: DisplayName = Microsoft.VisualStudio.TextTemplating.14.0, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: (Fully-specified) [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Appbase = file:///C:/Program Files (x86)/MSBuild/14.0/Bin/ [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Initial PrivatePath = NULL [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: Calling assembly : Microsoft.VisualStudio.TextTemplating.Sdk.Host.14.0, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: === [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: This bind starts in LoadFrom load context. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load(). [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Using application configuration file: C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe.Config [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Using host configuration file: [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Post-policy reference: Microsoft.VisualStudio.TextTemplating.14.0, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Attempting download of new URL file:///C:/Program Files (x86)/MSBuild/14.0/Bin/Microsoft.VisualStudio.TextTemplating.14.0.DLL. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Attempting download of new URL file:///C:/Program Files (x86)/MSBuild/14.0/Bin/Microsoft.VisualStudio.TextTemplating.14.0/Microsoft.VisualStudio.TextTemplating.14.0.DLL. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Attempting download of new URL file:///C:/Program Files (x86)/MSBuild/14.0/Bin/Microsoft.VisualStudio.TextTemplating.14.0.EXE. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Attempting download of new URL file:///C:/Program Files (x86)/MSBuild/14.0/Bin/Microsoft.VisualStudio.TextTemplating.14.0/Microsoft.VisualStudio.TextTemplating.14.0.EXE. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Attempting download of new URL file:///C:/Program Files (x86)/MSBuild/Microsoft/VisualStudio/v14.0/TextTemplating/Microsoft.VisualStudio.TextTemplating.14.0.DLL. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Attempting download of new URL file:///C:/Program Files (x86)/MSBuild/Microsoft/VisualStudio/v14.0/TextTemplating/Microsoft.VisualStudio.TextTemplating.14.0/Microsoft.VisualStudio.TextTemplating.14.0.DLL. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Attempting download of new URL file:///C:/Program Files (x86)/MSBuild/Microsoft/VisualStudio/v14.0/TextTemplating/Microsoft.VisualStudio.TextTemplating.14.0.EXE. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: LOG: Attempting download of new URL file:///C:/Program Files (x86)/MSBuild/Microsoft/VisualStudio/v14.0/TextTemplating/Microsoft.VisualStudio.TextTemplating.14.0/Microsoft.VisualStudio.TextTemplating.14.0.EXE. [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\TextTemplating\Microsoft.TextTemplating.targets(396,5): error MSB4018: [D:\TTTest\ClassLibrary1\ClassLibrary1.csproj] 
Done Building Project "D:\TTTest\ClassLibrary1\ClassLibrary1.csproj" (Rebuild target(s)) -- FAILED. 

Done Building Project "D:\TTTest\ClassLibrary1.sln" (Rebuild target(s)) -- FAILED. 


Build FAILED. 

回答

0

问题似乎是.NET无法找到程序集Microsoft.VisualStudio.TextTemplating.14.0.dll

所以不是藏在心里单独的文件夹为Visual Studio中安装它们,我采取了以下文件:

  • C:\ Program Files文件(x86)的\的MSBuild \微软\ VisualStudio的\ v14.0 \ TextTemplating
    • Microsoft.VisualStudio.TextTemplating.Sdk.Host.14.0。DLL
    • Microsoft.TextTemplating.Build.Tasks.dll
    • Microsoft.TextTemplating.targets
  • C:\ Program Files文件(x86)的\微软的Visual Studio 14.0 \ VSSDK \ VisualStudioIntegration \ COMMON \组件\ V4 0.0
    • Microsoft.VisualStudio.TextTemplating.14.0.dll
    • Microsoft.VisualStudio.TextTemplating.Interfaces.14.0.dll(几个文件)
    • Microsoft.VisualStudio.TextTemplating .VSHost.14.0.dll
  • C:\ Program Files文件(x86)的\微软的Visual Studio 14.0 \ Common7 \ IDE \ PublicAssemblies \
    • Microsoft.VisualStudio.TextTemplating.Modeling.14.0.dll

并复制他们都到MSBuild任务目录:

  • C:\ Program Files文件(x86)的\中号SBuild \ Microsoft \ VisualStudio \ v14.0 \ TextTemplating

这样做后,.NET能够找到它需要的程序集并转换模板。

0

当我看着在文件Microsoft.TextTemplating.targets,发现它使用注册表项来找到谁包含dlls文件夹:

<PropertyGroup Condition=" $(IncludeDslT4Settings)=='true' "> 
<!-- Path to VS\Common7\IDE --> 
<!-- Check the 32bit location first ; if that is empty, use the 64bit location. --> 
<VsIdePath>$(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\[email protected])</VsIdePath> 
<VsIdePath Condition=" $(VsIdePath) == ''" >$(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\[email protected])</VsIdePath> 

<!-- Set the default location for the Dsl Designer install. --> 
<DslDesignerInstallPath Condition=" $(DslDesignerInstallPath)=='' ">$(VsIdePath)Extensions\Microsoft\DSL SDK\Dsl Designer\$(VisualStudioVersion)\</DslDesignerInstallPath> 

<!-- Add the standard DSL templates folder --> 
<IncludeFolders>$(IncludeFolders);$(DslDesignerInstallPath)TextTemplates\</IncludeFolders> 

因此,我必须安装Microsoft Visual Studio 2015 SDK和Microsoft Visual Studio 2015可视化&将构建服务器上的SDK建模到注册表DLL。

但是,从Visual Studio 2015开始,您不需要从下载中心安装Visual Studio SDK。 它作为Visual Studio安装程序中的可选功能包含在内。所以我们无法安装Visual Studio SDK而无需安装Visual Studio。详细信息请参阅Visual Studio SDK

此外,丹尼尔有一个关于How to transform T4 templates on build without installing a Visual Studio SDK的博客,你可以检查是否给予任何帮助。

+0

对不起,当你说“当我们看着......”时,你想说的是你在微软工作,你的团队潜入了这个问题,还是你自己的开发团队需要此功能,并最终只在生成服务器上安装Visual Studio? –

+0

不幸的是,Daniel的解决方案似乎不适用于我们,因为我们需要使用“TextTemplatingFilePreprocessor”,并且发行说明包括:“由于TextTemplating.exe不支持根据http不支持处理T4文件和'TextTemplatingFilePreprocessor' ://stackoverflow.com/a/9198532“。 –

+0

该线程已被删除。 AFAIK,在Visual Studio之外转换这些文件很麻烦(在命令提示符下或在您的构建过程中)。特别是,我们无法单独安装VS VS15和VSD15。魔术一直在发生。 Mikayla为MonoDevelop IDE写了一个干净的反向工程实现T4引擎:https://stackoverflow.com/questions/978281/t4-without-visual-studio。你可以检查它是否对你有帮助。 –