排除MSBuild故障

4
我正在尝试将我的商店从使用VSS转换到TFS。
我们目前的代码库由大量的Visual Studio 2008解决方案组成,我注意到其中一些似乎会导致MSBuild失败,但我无法找出原因。实际的解决方案和它们所持有的项目构建正确,但整体构建仍然失败。
ErrorsAndWarnings.txt和Release.txt文件没有显示错误,只有警告(代码中需要清理的各种小事情)。
BuildLog.txt文件当然是巨大的,并且有大量难以理解的文本。据我所知,当它遇到其中一个导致问题的SLN文件时,MSBuild就会崩溃并死机。
任务 "MSBuild" 全局属性: Configuration=Release Platform=Any CPU OutDir=C:\TFS\REPOSITORY\Full\Binaries\Release\ PublishDir=C:\TFS\REPOSITORY\Full\Binaries\Release\ SkipInvalidConfigurations=true RunCodeAnalysis=false VCBuildOverride=C:\TFS\REPOSITORY\Full\Sources\Code\Solution\Solution.sln.Release.vsprops VCBuildAdditionalLibPaths= VCBuildAdditionalOptions= VCBuildToolPath= VCBuildUseEnvironment= TeamBuildConstants=_TEAM_BUILD_ TargetsNotLogged=GetTargetPath;GetNativeManifest;GetCopyToOutputDirectoryItems
C:\Program Files\MSBuild\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets(1008,5): 错误 MSB4018: "MSBuild" 任务意外失败。 错误 MSB4018: System.NullReferenceException: 对象引用未设置为对象的实例。 错误 MSB4018: at Microsoft.Build.BuildEngine.SolutionWrapperProject.AssignDependencyLevel(ProjectInSolution project, SolutionParser solution, Dictionary`2 projectsByDependencyLevel) 错误 MSB4018: at Microsoft.Build.BuildEngine.SolutionWrapperProject.AssignDependencyLevel(ProjectInSolution project, SolutionParser solution, Dictionary`2 projectsByDependencyLevel) 错误 MSB4018: at Microsoft.Build.BuildEngine.SolutionWrapperProject.AssignDependencyLevels(SolutionParser solution, Dictionary`2 projectsByDependencyLevel) 错误 MSB4018: at Microsoft.Build.BuildEngine.SolutionWrapperProject.CreateSolutionProject(SolutionParser solution, Project msbuildProject, BuildEventContext projectBuildEventContext, String wrapperProjectToolsVersion, Engine parentEngine, String solutionProjectCache) 错误 MSB4018: at Microsoft.Build.BuildEngine.SolutionWrapperProject.Generate(SolutionParser solution, Project msbuildProject, String toolsVersionOverride, BuildEventContext projectBuildEventContext) 错误 MSB4018: at Microsoft.Build.BuildEngine.Project.Load(String projectFileName, BuildEventContext buildEventContext, ProjectLoadSettings projectLoadSettings) 错误 MSB4018: at Microsoft.Build.BuildEngine.Engine.GetMatchingProject(Project existingProject, String projectFullPath, BuildPropertyGroup globalPropertiesToUse, String toolsVersion, String[] targetNames, BuildEventContext buildEventContext, Boolean toolsVersionPeekedFromProjectFile) 错误 MSB4018: at Microsoft.Build.BuildEngine.Engine.BuildProjectFileInternal(BuildRequest buildRequest) 错误 MSB4018: at Microsoft.Build.BuildEngine.Engine.EngineBuildLoop(BuildRequest terminatingBuildRequest) 错误 MSB4018: at Microsoft.Build.BuildEngine.TaskExecutionModule.BuildProjectFile(Int32 handleId, String[] projectFileNames, String[] targetNames, IDictionary[] globalPropertiesPerProject, IDictionary[] targetOutputsPerProject, EngineLoggingServices loggingServices, String[] toolsVersions, Boolean useResultsCache, Boolean unloadProjectsOnCompletion, BuildEventContext taskContext) 错误 MSB4018: at Microsoft.Build.BuildEngine.EngineProxy.BuildProjectFilesInParallel(String[] projectFileNames, String[] targetNames, IDictionary[] globalProperties, IDictionary[] targetOutputsPerProject, String[] toolsVersions, Boolean useResultsCache, Boolean unloadProjectsOnCompletion) 错误 MSB4018: at Microsoft.Build.Tasks.MSBuild.ExecuteTargets(ITaskItem[] projects, Hashtable propertiesTable, ArrayList targetLists, Boolean stopOnFirstFailure, Boolean rebaseOutputs, IBuildEngine2 buildEngine, TaskLoggingHelper log, ArrayList targetOutputs, Boolean useResultsCache, Boolean unloadProjectsOnCompletion, String toolsVersion) 错误 MSB4018: at Microsoft.Build.Tasks.MSBuild.BuildProjectsInParallel(Hashtable propertiesTable, ArrayList targetLists, Boolean success, Boolean[] skipProjects) 错误 MSB4018: at Microsoft.Build.Tasks.MSBuild.Execute() 错误 MSB4018: at Microsoft.Build.BuildEngine.TaskEngine.ExecuteInstantiatedTask(EngineProxy engineProxy, ItemBucket bucket, TaskExecutionMode howToExecuteTask, ITask task, Boolean& taskResult) 在项目 "TFSBuild.proj" 中编译目标 "CoreCompileSolution" -- 失败。 在项目 "C:\TFS\REPOSITORY\Full\BuildType\TFSBuild.proj" 中构建完成 (CompileSolution 目标(s)) -- 失败。 执行任务 "MSBuild" 完成 -- 失败。 在项目 "TFSBuild.proj" 中编译目标 "CoreCompileConfiguration" -- 失败。 在项目 "C:\TFS\REPOSITORY\Full\BuildType\TFSBuild.proj" 中构建完成 (CompileConfiguration 目标(s)) -- 失败。 执行任务 "MSBuild" 完成 --
我知道在Stack Overflow上贴入冗长的错误信息很糟糕,但是从上面可以得出一个核心问题:MSBuild崩溃了,我无法找出原因。它会给出通常的“对象引用未设置…”错误,当你正在解决问题时,这种错误几乎是普遍无用的,因为这不是你的代码或程序。
我看到它引用了TeamFoundation.Build.targets文件。我查看了该文件,但无法确定问题所在。(注释后面的行是上面提到的(1008,5))
<!-- Build using MSBuild task -->
<MSBuild BuildInParallel="$(BuildSolutionsInParallel)"
         Projects="$(Solution)"
         Properties="Configuration=$(Configuration);Platform=$(Platform);$(OutDirOption);$(PublishDirOption);SkipInvalidConfigurations=$(SkipInvalidConfigurations);$(FxCopDirOption);$(ReferencePathOption);$(CodeAnalysisOption);
                         VCBuildOverride=$(VsPropsFile);VCBuildAdditionalLibPaths=$(VCBuildAdditionalLibPaths);VCBuildAdditionalOptions=$(VCBuildAdditionalOptions);VCBuildToolPath=$(VCBuildToolPath);VCBuildUseEnvironment=$(VCBuildUseEnvironment);
                         TeamBuildConstants=$(TeamBuildConstants);TargetsNotLogged=$(TargetsNotLogged);$(CustomPropertiesForBuild);$(CustomProperties)"
         Targets="$(Targets)"
         StopOnFirstFailure="$(StopOnFirstFailure)">
  <Output TaskParameter="TargetOutputs" ItemName="CompilationOutputs" />
</MSBuild>

起初我以为这是在告诉我节点中需要替换的项目之一缺失了,但是其他没有问题的解决方案具有类似/相同的设置。

我注意到MSBuild调用堆栈中的一些项目涉及目标,问题似乎源自TeamFoundation.Build.targets文件,但我不知道下一步该如何进行故障排除。

有人遇到过这种情况吗?

4个回答

5

我认为解决方案文件已经损坏,但是VS更加宽容。(如果我没记错的话,这种崩溃可能由于花括号不匹配)

如果可行的话,我会在VS中重新创建解决方案文件。 Dan (msbuild团队)


顺便提一下,我已经在谷歌上搜索了几个小时来解决完全相同的问题。最终我重建了解决方案文件,现在一切都好了。在比较解决方案文件时,我发现一些项目GUID不正确匹配... - joshua.ewer

2

当你说:

实际的解决方案和它们包含的项目都正确构建

你是指它们在IDE中正确构建还是指你可以通过命令行进入那些解决方案目录并运行'msbuild foo.proj'或'msbuild bar.sln'来构建成功?

无论如何,我建议首先缩小问题范围,���过告诉TFS不要并行构建、关闭多CPU支持(例如,'-maxcpucount:1'),通过逐渐删除解决方案/项目进行二分搜索。一旦找到有问题的集合,使用“-v:diag”参数构建以获取更多关于MSBuild引擎状态的详细信息。

另外,你可以编写一个小型的C#应用程序,直接调用MSBuild引擎,并通过捕获第一次机会异常并准备好Reflector来调试该应用程序。请参阅MSBuild Engine Class中的示例代码。


我遇到了类似的错误,正在尝试实现您的建议。我如何告诉 TFS 不要并行构建? - spilliton
嗯,将BuildSolutionsInParallel属性设置为false。 - Ants

1

嗯,你得到了一个NullReferenceException,这意味着任务中的一个参数为空,但它不应该是空的。愚蠢的问题,但你是否已经使用你想要构建的解决方案设置了TFSBuild.proj文件?即放入Itemgroup的东西。

如果你已经这样做了,我建议在Teambuild目标文件中添加消息任务,就在失败的任务上面写出诊断信息,像这样:

这应该会在你下一次构建时,在你粘贴的日志摘录上方喷出一些诊断信息。


0

你可以尝试使用MSBuild-Sidekicks。它们包含了一个非常方便的MSBuild调试器,并提供14天的试用版本:http://www.attrice.info/msbuild/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接