I have a large solution with more than 100 projects (C++, Managed C++, C#) and many of them depends on each others.
I have a TeamCity server and I want build this solution there.
When I build solution in VisualStudio everything goes fine, but with TeamCity I have a CS0006 error.
I know why that so – TeamCity uses MSBuild 4 to build solutions, but there is a known bug in MSBuild 4 – it ignores build order and build projects from solutions in order it wants.
Because of this behavior if you have:
Project A
Project B which has reference to A
MSBuild can build these project in such order:
1. B
2. A
The easiest solution is to set BuildProjectReferences=true (which is default) and all referenced project will be builded automatically. But I can’t use this approach because not all referenced project in this solution, and I can’t build projects from another solution.
Here is another fix for this problem – use ConfigurationManager and disable all projects, which shouldn’t build, but it works only in VisualStudio – MSBuild ignores that and builds all referenced projects.
The problem is to restore build order which I can see in VisualStudio in window ProjectBuildOrder which is not true if I use MSBuild directly from Console.
See Incorrect solution build ordering when using MSBuild.exe at The Visual Studio Blog:
You may not have done that before because you didn’t want to reference the target of the project reference, but merely order the build. However, in 4.0 you can create a project reference that only orders the build without adding a reference. It would look like this – note the metadata element, and all this is inside an
<ItemGroup>tag of course:Note that you have to add the child element with a text editor — Visual Studio can add a project reference, but doesn’t expose UI for this metadata.
I can tidy up by removing the dependency in the solution file as well – removing now-unnecessary lines like this — your GUID will be different, but use the VS dialog and it will do the job…