MSBuild - состояние гонки при попытке создания ссылок на проекты

Я столкнулся со странной проблемой, пытаясь построить с использованием MSBuild.

Я использую MSBuild для создания файла решения с /m (параллельная сборка) и BuildProjectReferences, установленным в true. Предположим, у меня есть A.vcxproj и B.vcxproj в файле sln, где B имеет ссылку на проект A. В этом случае сначала начинается сборка проекта, а во время компиляции проект B начинает сборку в другом процессе (с параллельных сборок) и вызовет сборку A. Теперь это вызывает состояние гонки, потому что у нас есть два процесса, пытающихся построить один и тот же проект A, и я вижу проблемы с доступом.

В идеале MSBuild не должен вызывать сборку B, если A еще не завершил сборку или если он действительно вызывает B, то обнаруживает, что A все еще строит, и ожидает его завершения. Ничего из этого не происходит. Кроме того, это происходит только с MSBuild - не происходит, если я пытаюсь построить файл решения из IDE VS2015.

Есть идеи, почему MSBuild ведет себя так?

1 ответ

Решение

Наконец-то нашел решение моей проблемы

MSBuild ожидает, что зависимости проекта будут добавлены двумя способами
1. В самом vcxproj добавьте все зависимые ссылки на проект
2. В файле sln также определите зависимости проекта.

В следующем блоге VS фактически говорится об обратном. Например: https://blogs.msdn.microsoft.com/vcblog/2010/02/16/project-settings-changes-with-vs2010/ говорится, что зависимости проекта и ссылки на проекты аналогичны и используйте только одну конкретную ссылку на проект.

Это может быть правдой при сборке с использованием VS IDE, но не для MSBuild. Необходимо, чтобы зависимости проекта были определены как в ProjectReference, так и в ProjectDependencies.

Надеюсь, это поможет всем, кто столкнулся с той же проблемой, что и я.