MSBuild Design Practice for Custom Props/Targets

449 views Asked by At

I have a NuGet package I'm working on with custom props/targets files and am wondering about best practice for how to many Properties, Items, and Targets in terms of definition and overriding.

Is it better to have all properties directly in my MyNuGetPackage.targets file and don't use the MyNuGetPackage.props at all, like so?

<PropertyGroup>
    <UseMyTarget Condition="'$(Prop1)' == ''">true</UseMyTarget>
</PropertyGroup>

<Target Name="MyTarget" Condition="'$(UseMyTarget)' == 'true'>
  ...
</Target>

or is it better practice to define UseMyTarget in the .props file, unconditionally and keep the target in the .targets file?

Both approaches break down if I need to catch a property that Microsoft or someone else sets a default value for. For example:

<PropertyGroup>
    <MyCustomOutputPath>$(OutputPath)/somethingelse</UseMyTarget>
</PropertyGroup>

If I define this in .props, OutputPath may not have been set yet...

On the other hand MANY authors seem to exclusively use .targets themselves...so am I better off just doing something like this for dependent things in my .targets and not bother with .props files?

<Project InitialTargets="InitializeDependentProperties">
  <Target Name="InitializeDependentProperties">
    <PropertyGroup>
      <MyCustomOutputPath>$(OutputPath)/somethingelse</UseMyTarget>
    </PropertyGroup>
  </Target>
</Project>

Microsoft's own practices for their own MSBuild props/targets don't seem to follow any kind of standard/convention at all.

I DO want to allow consuming projects to be able to alter behavior of my .props/.targets by setting Properties/Items/Targets themselves.

0

There are 0 answers