This seems like an obvious thing to want to do but I have pulled most of my hair out trying to find any examples on the web or do it myself.
I have a c# solution with 19 projects and a Jenkins build server running a build script to drive MSBuild. MSBuild will of course determine what does and does not need to be compiled based on inputs versus outputs.
I am trying to create a custom target to conditionally update the AssemblyInfo.cs of those projects MSBuild is going to compile to increment the file versions. Of course I want to leave the projects not being compiled alone.
I know how to inject a target prior to the CoreBuild that runs every time so if there is some variable I can test to see if a compile will occur that can work. I also know how to determine if a compile ran and therefore conditionally do some post processing which is possible but not ideal.
How can I tweak my build process to achieve this?
Since it seems there’s no straight answer to the question, does anyone know how to perform the same logic as MSBuild to determine what projects require a rebuild?
In the end the solution was a combination of Sayed Ibrahim Hashimi’s blog entry and information from the MSDN Forum entry ‘Execute target when (core)compile will execute’.
I basically took Sayed’s injection method to get my target to run ‘extend-corecompile.proj’ on all projects without having to edit each proj file but replaced it’s contents with an override for ‘CoreCompileDependsOn’ that points to a custom target that adopts the same inputs and outputs as the ‘CoreCompile’ target. The end result is a target that only runs when ‘CoreCompile’ will run while being centrally managed in the build script.
Thanks to all for their input and here is the skeleton code I used in ‘extend-corecompile.proj’:
Not sure what will happen if CoreCompile fails, does it still call our target? I guess in time we’ll find out 🙂