tags:

views:

30

answers:

1

Hi, I'm writing an msbuild file and have something like this:

<ValidateDependsOn>$(ValidateDependsOn);ValidateA</ValidateDependsOn>
<ValidateDependsOn>$(ValidateDependsOn);ValidateB</ValidateDependsOn>

<Target Name="BuildA">
    <!-- stuff -->
</Target>

<Target Name="BuildB">
    <!-- stuff -->
</Target>

<Target Name="ValidateA">
    <Error /> <!-- check properties and machine environment are suitable to run BuildA -->
</Target>

<Target Name="ValidateB">
    <Error /> <!-- check properties and machine environment are suitable to run BuildB -->
</Target>

Builds can take a while. Originally we had the Build steps depending on the Validate steps, but sometimes a validate step wouldn't run until the middle of the build and you would have wasted time getting there. So, we moved the validate steps to the start by using the ValidateDependsOn pattern to insert the targets to run up front.

The problem now though is that sometimes during a build BuildB may not actually run, and this means I don't need and in fact, don't want ValidateB to run. Is there any way I can selectively update ValidateDependsOn by conditionally knowing which targets will actually be run?

I'm looking for something equivalent to:

<ValidateDependsOn Condition="TargetWillRun(BuildB)">$(ValidateDependsOn);ValidateB</ValidateDependsOn>
A: 

The most obvious solution would be (if I understand your aim right) to simply do exactly what you described and make BuildA depend on ValidateA and BuildB depend on ValidateB.

<PropertyGroup>
  <BuildADependsOn>ValidateA;$(BuildADependsOn)</BuildADependsOn>
</PropertyGroup>
mfloryan