4 Stimmen

Fehlerbehebung bei MSBuild-Fehlern

Ich versuche, mein Geschäft von VSS auf TFS umzustellen.

Unsere aktuelle Codebasis besteht aus einer großen Anzahl von Visual Studio 2008-Lösungen, und ich habe bemerkt, dass einige von ihnen MSBuild zum Scheitern zu bringen scheinen, aber ich kann nicht herausfinden, warum. Die eigentlichen Lösungen selbst und die Projekte, die sie enthalten, bauen richtig, aber der gesamte Build schlägt immer noch fehl.

Die Dateien ErrorsAndWarnings.txt und Release.txt enthalten keine Fehler, sondern nur Warnungen (verschiedene Kleinigkeiten im Code, die bereinigt werden müssen)

Die Datei BuildLog.txt ist natürlich riesig und enthält tonnenweise schwer zu verstehenden Text. Soweit ich das beurteilen kann, stürzt MSBuild einfach ab, wenn es zu einer dieser SLN-Dateien kommt, die ihm Probleme bereiten.

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.

Ich weiß, dass es lahm ist, unglaublich ausführliche Fehlermeldungen in Stack Overflow einzufügen, aber das Wichtigste, was man aus dem oben Gesagten mitnehmen kann, ist MSBuild stürzt ab und ich kann mir nicht erklären, warum. Es gibt die übliche "Object reference not set..."-Fehler, die so ziemlich allgemein nutzlos ist, wenn es nicht Ihr Code oder Programm Sie Fehlerbehebung sind.

Ich sehe, dass sie auf TeamFoundation.Build.targets verweist. Ich schaue in dieser Datei nach, aber es fällt mir nicht wirklich auf, was das Problem sein könnte. (die Zeile nach dem Kommentar ist die (1008,5), auf die oben verwiesen wurde)

<!-- 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>

Zuerst dachte ich, dass mir dies sagt, dass eines der Elemente, die im Knoten ersetzt werden müssen, fehlt, aber die anderen Lösungen, die keine Probleme haben, haben ähnliche/identische Setups.

Ich stelle fest, dass einige der Elemente im Aufrufstapel von MSBuild mit Zielen zu tun haben und das Problem aus der Datei TeamFoundation.Build.targets zu stammen scheint, aber ich weiß nicht, was ich als Nächstes tun soll, um das Problem zu beheben.

Ist das schon einmal vorgekommen?

5voto

Ich glaube, die Lösungsdatei ist beschädigt, und VS ist toleranter. (Wenn ich mich richtig erinnere, kann dieser Absturz durch eine nicht übereinstimmende geschweifte Klammer verursacht werden)

Wenn es möglich ist, würde ich die Lösungsdatei von VS aus neu erstellen. Dan (msbuild team)

2voto

Ants Punkte 2568

Als Sie sagten:

Die eigentlichen Lösungen selbst und die Projekte, die sie enthalten, bauen richtig auf

Meinen Sie, dass sie in der IDE korrekt erstellt werden, oder dass Sie diese Lösungsverzeichnisse auf der Befehlszeile aufrufen und "msbuild foo.proj" oder "msbuild bar.sln" ausführen können?

Wie auch immer, ich würde zunächst versuchen, die fehlerhafte Lösung/das fehlerhafte Projekt einzugrenzen, indem ich TFS anweise, nicht parallel zu bauen, die Multi-CPU-Unterstützung auszuschalten (z.B. '-maxcpucount:1') und eine binäre Suche durchzuführen, indem ich Lösungen/Projekte ausschließe. Sobald Sie den fehlerhaften Satz gefunden haben, erstellen Sie ihn mit dem Parameter '-v:diag', um noch mehr Details über den Zustand der MSBuild-Engine zu erhalten.

Alternativ können Sie eine kleine C#-Anwendung schreiben, die die MSBuild-Engine direkt aufruft, und diese Anwendung debuggen, indem Sie die ersten Ausnahmen abfangen und Reflector zur Hand haben. Siehe Beispielcode in MSBuild-Engine-Klasse .

1voto

Erling Paulsen Punkte 578

Hmmm. Sie erhalten eine NullReferenceException, was bedeutet, dass einer der Parameter in dieser Aufgabe eine Null ist, obwohl er es nicht sein sollte. Dumme Frage, aber haben Sie Ihre TFSBuild.proj-Datei mit den Lösungen eingerichtet, die Sie erstellen möchten? IE. das Zeug, das Sie in der - Itemgroup.

In diesem Fall würde ich vorschlagen, der Teambuild-Zieldatei Nachrichtenaufgaben direkt über der fehlgeschlagenen Aufgabe hinzuzufügen, um Diagnoseinformationen zu schreiben, etwa so:

Das sollte einige Diagnoseinformationen in Ihr Buildlog direkt über dem Logauszug ausspucken, den Sie bei Ihrem nächsten Build eingefügt haben.

0voto

TToni Punkte 8755

Vielleicht möchten Sie die MSBuild-Sidekicks ausprobieren. Sie haben einen netten kleinen Debugger für MSBuild enthalten und bieten eine 14-tägige Testversion: http://www.attrice.info/msbuild/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X