当我签入代码时,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)
答案 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
它为我解决了这个问题。
答案 2 :(得分:2)
经过大量研究并尝试了一堆&#34; hacks&#34;我继续了解nuget恢复的确切机制。事实证明,自nuget 2.7+以来,一切都发生了变化,你不再需要包含&#34; .nuget&#34;文件夹和相关的nuget.exe和nuget.target
要修复我的构建过程并使用最新推荐的方法,我执行了以下操作:
-
<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>