Andrew:
First off, we violate a couple of "best practices" to accomplish this, but pragmatism is where best practice meets the real world.
What we do is this:
- All binaries are checked in to TFS within a LocalBin folder that consolidates all of our binaries.
- All shared assemblies are located within a folder called LocalBin/SharedBin
- The SharedBin folder is branched to a top-level SharedBin folder within the consuming team project(s).
- On a successful main build, the LocalBin/Sharedbin is merged to the projects' SharedBin folders.
It winds up being something like this:
$/ProjectA/Main/Localbin/SharedBin
is branched to $/ProjectB/Main/SharedBin
and $/ProjectB/Dev/Sharedbin
(as well as the equivalent folders in $/ProjectC
, $/ProjectD
et cetera).
We only do this sharing when we have a successful MAIN build, and the build is responsible for merging not only to the other MAIN branch projects, but also to the DEV branch projects, so they are up to date.
We've toyed around with the idea of coping the binaries to a shared network location after successful build, and having a convention to reference those binaries in that network share, but this process is working well for us today, and we're loathe to make changes to it at this point (more important things happening for now).
This is one of those things that's hard to fully describe in a posting, so if you have further questions, I'd be happy to try to answer them.
BTW, our solution was built and is running under TFS2008 with thousands of project files, and likely millions of lines of code. It does increase the build time due to the merge and increases the amount of space used in your repository, but both have been manageable thus far.