I’m having some trouble with a msbuild file.
I’d like the build to have three targets, executed in this order:
Cleanup: Cleans the output of a previous buildBuild: The actual buildCopyFiles: A task that packages the output of the build for an easier deployment
Now the problem is: I want a property (ReleasePath) for the CopyFiles target to be explicitly set by the caller. Also, the caller shouldn’t have to set the output path if only calling the Cleanup and Build tasks.
My first try has been:
<PropertyGroup>
<ReleasePath></ReleasePath>
</PropertyGroup>
<Target Name="Initialize">
<Error Text="The ReleasePath property isn't defined" Condition="'$(ReleasePath)' == ''"/>
</Target>
<Target Name="CopyFiles" DependsOnTargets="Initialize">
</Target>
It works fine, but the Initialize target is executed right before CopyFiles, that is after Build. And the Buildtarget can take quite a long time to execute, so if something’s wrong I’d like the user to be notified right away.
So basically, is there a way to run the Initialize target at the beginning, but only if CopyFiles is included in the targets?
I also thought of putting Initialize in the InitialTargets attribute of the project, then put a condition to execute this target only if CopyFiles is selected, but to my surprise I couldn’t find a property containing the list of targets selected by the caller.
I think the easiest way to accomplish your goal would be to use a Property to toggle CopyFiles rather than the list of targets passed in. If you always add CopyFiles to the AfterBuild target but condition it on a property like “ShouldCopyFiles” then you could also conditionalize the DependsOnTargets of Build:
At this point you could call MSBuild like this:
and that would toggle it on.