Устранение ошибок MSBuild - PullRequest
4 голосов
/ 30 марта 2009

Я пытаюсь преобразовать свой магазин из VSS в TFS.

Наша текущая кодовая база состоит из большого количества решений Visual Studio 2008, и я заметил, что некоторые из них вызывают сбой MSBuild, но я не могу понять, почему. Сами фактические решения и проекты, которые они держат, создаются правильно, но общая сборка все равно не работает.

В файлах ErrorsAndWarnings.txt и Release.txt нет ошибок, только предупреждения (различные мелочи в коде, который нам нужно очистить)

Файл 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 неэффективна, но главное, что следует принять из вышесказанного, это 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 ]

4 голосов
/ 31 марта 2009

Я считаю, что файл решения поврежден, а VS более терпим. (Если я правильно помню, этот сбой может быть вызван бесподобной фигурной скобкой)

Если это возможно, я бы воссоздал файл решения из VS. Дэн (команда разработчиков)

2 голосов
/ 30 марта 2009

Когда вы сказали:

Сами фактические решения и проекты, которые они держат, построены правильно

Вы имеете в виду, что они правильно собираются в среде IDE или что вы можете перейти в эти каталоги решений в командной строке и запустить msbuild foo.proj или msbuild bar.sln?

В любом случае, я бы сначала попытался сузить проблемное решение / проект, сказав, что TFS не следует строить параллельно, отключить поддержку нескольких процессоров (например, '-maxcpucount: 1'), выполнить бинарный поиск, обрезав выездные решения / проекты. Как только вы дойдете до набора нарушителей, выполните сборку с параметром -v: diag, чтобы получить еще более подробную информацию о состоянии механизма MSBuild.

В качестве альтернативы, вы можете написать небольшое приложение на C #, которое напрямую вызывает ядро ​​MSBuild и отлаживает это приложение, отлавливая исключения первого шанса и имея под рукой Reflector. Увидеть Пример кода в Класс двигателя MSBuild .

1 голос
/ 02 апреля 2009

Хммм. Вы получаете NullReferenceException, означающее, что один из параметров в этой задаче является нулевым, когда это не должно быть. Тупой вопрос, но настроили ли вы файл TFSBuild.proj с решениями, которые вы хотите создать? IE. материал, который вы положили в - Группа товаров.

Если у вас есть, я бы предложил добавить задачи сообщений в файл целей Teambuild чуть выше сбойной задачи, чтобы записать диагностическую информацию, например, так:

Это должно излить некоторую диагностическую информацию в ваш журнал сборки чуть выше журнала, который вы вставили в следующую сборку.

0 голосов
/ 03 апреля 2009

Вы можете попробовать MSBuild-Sidekicks. У них есть отличный отладчик для MSBuild и предлагается 14-дневная пробная версия: http://www.attrice.info/msbuild/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...