代码之家  ›  专栏  ›  技术社区  ›  Tom Kidd

MSBuild故障排除

  •  4
  • Tom Kidd  · 技术社区  · 16 年前

    我们当前的代码库由大量VisualStudio2008解决方案组成,我注意到其中一些解决方案似乎会导致MSBuild失败,但我不知道为什么。实际的解决方案本身和它们所持有的项目构建正确,但总体构建仍然失败。

    当然,BuildLog.txt文件非常庞大,其中包含大量难以理解的文本。但我能说的最好的是,当这些SLN文件中的一个给它带来问题时,MSBuild完全崩溃并死亡。

    Task "MSBuild"
      Global Properties:
        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): 
    error MSB4018: The "MSBuild" task failed unexpectedly.
    error MSB4018: System.NullReferenceException: Object reference not set to an instance of an object.
    error MSB4018:    at Microsoft.Build.BuildEngine.SolutionWrapperProject.AssignDependencyLevel(ProjectInSolution project, SolutionParser solution, Dictionary`2 projectsByDependencyLevel)
    error MSB4018:    at Microsoft.Build.BuildEngine.SolutionWrapperProject.AssignDependencyLevel(ProjectInSolution project, SolutionParser solution, Dictionary`2 projectsByDependencyLevel)
    error MSB4018:    at Microsoft.Build.BuildEngine.SolutionWrapperProject.AssignDependencyLevels(SolutionParser solution, Dictionary`2 projectsByDependencyLevel)
    error MSB4018:    at Microsoft.Build.BuildEngine.SolutionWrapperProject.CreateSolutionProject(SolutionParser solution, Project msbuildProject, BuildEventContext projectBuildEventContext, String wrapperProjectToolsVersion, Engine parentEngine, String solutionProjectCache)
    error MSB4018:    at Microsoft.Build.BuildEngine.SolutionWrapperProject.Generate(SolutionParser solution, Project msbuildProject, String toolsVersionOverride, BuildEventContext projectBuildEventContext)
    error MSB4018:    at Microsoft.Build.BuildEngine.Project.Load(String projectFileName, BuildEventContext buildEventContext, ProjectLoadSettings projectLoadSettings)
    error MSB4018:    at Microsoft.Build.BuildEngine.Engine.GetMatchingProject(Project existingProject, String projectFullPath, BuildPropertyGroup globalPropertiesToUse, String toolsVersion, String[] targetNames, BuildEventContext buildEventContext, Boolean toolsVersionPeekedFromProjectFile)
    error MSB4018:    at Microsoft.Build.BuildEngine.Engine.BuildProjectFileInternal(BuildRequest buildRequest)
    error MSB4018:    at Microsoft.Build.BuildEngine.Engine.EngineBuildLoop(BuildRequest terminatingBuildRequest)
    error 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)
    error MSB4018:    at Microsoft.Build.BuildEngine.EngineProxy.BuildProjectFilesInParallel(String[] projectFileNames, String[] targetNames, IDictionary[] globalProperties, IDictionary[] targetOutputsPerProject, String[] toolsVersions, Boolean useResultsCache, Boolean unloadProjectsOnCompletion)
    error 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)
    error MSB4018:    at Microsoft.Build.Tasks.MSBuild.BuildProjectsInParallel(Hashtable propertiesTable, ArrayList targetLists, Boolean success, Boolean[] skipProjects)
    error MSB4018:    at Microsoft.Build.Tasks.MSBuild.Execute()
    error MSB4018:    at Microsoft.Build.BuildEngine.TaskEngine.ExecuteInstantiatedTask(EngineProxy engineProxy, ItemBucket bucket, TaskExecutionMode howToExecuteTask, ITask task, Boolean& taskResult)
    Done building target "CoreCompileSolution" in project "TFSBuild.proj" -- FAILED.
    Done Building Project "C:\TFS\REPOSITORY\Full\BuildType\TFSBuild.proj" (CompileSolution target(s)) -- FAILED.
    Done executing task "MSBuild" -- FAILED.
    Done building target "CoreCompileConfiguration" in project "TFSBuild.proj" -- FAILED.
    Done Building Project "C:\TFS\REPOSITORY\Full\BuildType\TFSBuild.proj" (CompileConfiguration target(s)) -- FAILED.
    Done executing task "MSBuild" -- FAILED.
    Done building target "CoreCompile" in project "TFSBuild.proj" -- FAILED.
    Done Building Project "C:\TFS\REPOSITORY\Full\BuildType\TFSBuild.proj" (CoreCompile target(s)) -- FAILED.
    Done executing task "MSBuild" -- FAILED.
    Done building target "CallCompile" in project "TFSBuild.proj" -- FAILED.
    

    我知道在Stack Overflow中粘贴极其详细的错误消息是不明智的,但上面提到的核心内容是

    我看到它引用了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>
    

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

    以前有人碰到过这个吗?

    4 回复  |  直到 16 年前
        1
  •  5
  •   Dan Dan    16 年前

    我认为解决方案文件已损坏,VS的容忍度更高。(如果我没记错的话,这个崩溃可能是由不匹配的圆括号引起的)

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

        2
  •  2
  •   Ants    16 年前

    实际的解决方案本身以及它们所持有的项目能够正确构建

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

    或者,您可以编写一个小型C#应用程序,直接调用MSBuild引擎,并通过捕获第一次出现的异常和使用Reflector调试该应用程序。看见 中的示例代码 MSBuild Engine Class .

        3
  •  1
  •   Erling Paulsen    15 年前

    嗯,您会得到一个NullReferenceException,这意味着该任务中的一个参数在不应该为空时为空。这是一个愚蠢的问题,但您是否已使用要构建的解决方案设置了TFSBuild.proj文件?你放进冰箱里的东西 -项目组。

    如果有,我建议将消息任务添加到Teambuild目标文件中,就在失败任务上方,以写出诊断信息,如下所示:

        4
  •  0
  •   TToni    15 年前

    您可能希望尝试一下MSBuild的伙伴。他们为MSBuild提供了一个漂亮的小调试器,并提供了14天的试用版: http://www.attrice.info/msbuild/