Friday, July 13, 2012

TFS Build: output build results to separate folders

By default TFS Build will redirect the output of your projects to one location(specified by the BinariesDirectory parameter). This means that all DLL’s, executables and so on are available at one place. However the Sharepoint team asked me to change this so that TFS build put each project output into its own folder, instead of dropping all of the files into one flat structure. They wanted the same behavior as in Visual Studio so that the files are available under e.g. Bin\Release, Bin\Debug, etc… This makes it easier for them to run WSPBuilder and create deployment packages.

So how can we do this?
  • Open the Build Process template you are using.
  • Drill down until you find the “Run MSBuild for Project” task used to execute the MSBuild process.

image

  • Set the OutDir property to an empty string. The OutDir property over writes the default output path on each project. By clearing the OutDir property for the MsBuild Activity, Team build will use the Output Path defined in the project.

image

  • That’s it!

Remark 1:

If you want to have a reference to the default TFS outputdirectory, you can pass an extra property to MSBuild by setting your CommandLineArguments to something like the following. String.Format

("/p:SkipInvalidConfigurations=true /p:TeamBuildOutDir=""{0}"" {1}", BinariesDirectory, MSBuildArguments)

Inside your MSBuild files, you now have an extra property that you can use: $(TeamBuildOutDir).

Remark 2:

If you also want to copy the build output to the binariesdirectory, you’ll have to create some extra activities. For some help how to do this, check out this blog post.

6 comments:

Anonymous said...

Can i use the same method to publish my web projects? I have ASP.NET MVC project and i need to copy all build output files to the web site directory.

Bart Wullems said...

Yes, this works for all kind of projects.

Anonymous said...

You are my new best friend. Thanks for the simple solution, which worked great.

Sam Thwaites said...

I used the "Solution Specific Build Outputs" flag.. You just need to go into the advanced part of the process section and change the flag from false to true. Its help text says: "True will put build outputs into folders based on the solution name. False will put all build outputs into the same folder."

Anonymous said...

Hi,

I'm building a web application project using TFS 2010 build. I was wondering if there is any way to prevent build from dumping all the dlls into the root of the Binaries folder. I just want to keep the _PublishedWebsites there. I found few articles where they talk about getting rid of those dlls from the drop location, which basically gets its files from the Binaries folder.

Anonymous said...

Thank you so much. I've been looking for this for ages.