在TFS 2013上构建失败但在本地也没问题

时间:2013-12-18 15:22:17

标签: tfs msbuild nuget visual-studio-2013 tfs2013

当我签入代码时,TFS 2013自动构建了解决方案。在本地VS 2013中可以,但在TFS中失败。

以下是摘要。

Summary
FTPProcessor | Any CPU
1 error(s), 56 warning(s) 
$/xxxx/NewServiceHost/New-Branch/NewServiceHost/packageRestore.proj - 0 error(s), 0 warning(s) 
$/xxxx/NewServiceHost/New-Branch/GenericWindowsServices.sln - 1 error(s), 56 warning(s) 
C:\Builds\1\xxxx\FTP Processor (New)\src\.nuget\nuget.targets (71): The task factory "CodeTaskFactory" could not be loaded from the assembly "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Build.Tasks.v4.0.dll". Could not load file or assembly 'file:///C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Build.Tasks.v4.0.dll' or one of its dependencies. The system cannot find the file specified.
Other Errors 
1 error(s) 
Exception Message: MSBuild error 1 has ended this build. You can find more specific information about the cause of this error in above messages. (type BuildProcessTerminateException) Exception Stack Trace: at System.Activities.Statements.Throw.Execute(CodeActivityContext context) at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)

4 个答案:

答案 0 :(得分:54)

您的TFS 2013构建服务器正在使用MSBuild 12.0,其中CodeTasksFactory exists in Microsoft.Build.Tasks.v12.0.dll而不是Microsoft.Build.Tasks.v4.0.dll。

理想情况下,您应该执行以下操作:

1)打开您的NuGet.targets文件: C:\ Builds \ 1 \ xxxx \ FTP处理器(新)\ src.nuget \ nuget.targets

2)确定引用旧DLL的任务。

<UsingTask AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" TaskFactory="CodeTaskFactory" >
...

3)然后将来证明它是这样的:

<UsingTask AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" TaskFactory="CodeTaskFactory" >
...

答案 1 :(得分:4)

从VS2013开始, 你应该从C:\ Program Files(x86)\ MSBuild \ 12.0 \ Bin \

运行MSBuild

不是来自C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319。见

http://blogs.msdn.com/b/visualstudio/archive/2013/07/24/msbuild-is-now-part-of-visual-studio.aspx

源:http://gyorgybalassy.wordpress.com/2013/12/31/msb4175-the-task-factory-codetaskfactory-could-not-be-loaded/

它为我解决了这个问题。

答案 2 :(得分:2)

经过大量研究并尝试了一堆&#34; hacks&#34;我继续了解nuget恢复的确切机制。事实证明,自nuget 2.7+以来,一切都发生了变化,你不再需要包含&#34; .nuget&#34;文件夹和相关的nuget.exe和nuget.target

要修复我的构建过程并使用最新推荐的方法,我执行了以下操作:

  • 将nuget.config移动到与.sln文件相同的文件夹路径
  • 删除&#34; .nuget&#34;文件夹完全
  • 删除.sln文件中对该文件夹的引用
  • 从任何.csproj文件中删除以下行

-

<RestorePackages>true</RestorePackages>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />

-

如果您的项目解决方案包含许多文件,或者您使用的是Visual Studio 2013以及之前构建的许多项目,则可能需要一些时间。

好消息是,有一个powershell脚本可以递归地应用于任何文件夹:

  

简而言之,它会反转&#34;启用Nuget Package Restore&#34;,允许   更新的包恢复方法。

     

在Visual Studio 2013中,自动程序包还原成为其中的一部分   IDE(以及TFS构建过程)。这种方法比它更可靠   较旧的,msbuild集成包还原。它不需要你   让nuget.exe签入每个解决方案,不需要任何解决方案   额外的msbuild目标。但是,如果您有与之相关的文件   您的项目中的旧包还原方法,Visual Studio将   跳过自动包恢复。 (这种行为很可能会改变   很快,希望它确实如此)。

     

您可以使用此脚本删除nuget.exe,nuget.targets等   项目和解决方案引用nuget.targets所以你可以采取   自动包恢复的优点。它或多或少地自动化了   这里描述的过程。

     

它将通过您运行脚本的目录递归并执行   它适用于任何可能存在于某处的解决方案。小心点   玩得开心! (不对任何破坏负责)

关于这个主题的几个好的链接:

答案 3 :(得分:0)

我有类似的问题。我们被迫使用框架附带的旧版msbuild,而不是Visual Studio 2015附带的v14版本,因为我们构建了一些旧的Delphi.net代码。我们的vcxproj文件正在触发一些自动代码分析目标,该目标的任务依赖于Microsoft.Build.Tasks.v12.0.dll。我能够通过将其复制并粘贴到vcxproj的顶部并调整到dll的路径来覆盖该任务。原始任务可以在“C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v14.0 \ CodeAnalysis \ Microsoft.CodeAnalysis.Targets”中找到。换句话说,您可以覆盖项目中的问题任务。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- override a task which we can't use with the old msbuild -->
  <UsingTask TaskName="SetEnvironmentVariable" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
    <ParameterGroup>
      <EnvKey ParameterType="System.String" Required="true" />
      <EnvValue ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
      <Using Namespace="System" />
      <Code Type="Fragment" Language="cs">
        <![CDATA[
            try {
                Environment.SetEnvironmentVariable(EnvKey, EnvValue, System.EnvironmentVariableTarget.Process);
            }
            catch  {
            }
        ]]>
      </Code>
    </Task>
  </UsingTask>