В то время как другие ранее предоставленные ответы верны, я думаю, что они не упомянули о том, что я считаю основным преимуществом AfterTargets
над DependsOnTargets
.
DependsOnTargets
существует с самого начала MSBuild. Проблема с DependsOnTargets
заключается в том, что целевому автору необходимо явно разрешить расширяемость. Это делается путем определения свойства, которое используется в качестве значения DependsOnTargets
, следующим образом:
<PropertyGroup>
<SomeTargetDependsOnTargets>
Dependency1;Dependency2
</SomeTargetDependsOnTargets>
</PropertyGroup>
<Target Name="SomeTarget" DependsOnTargets="$(SomeTargetDependsOnTargets)">
...
</Target>
Затем можно добавить зависимость, изменив свойство SomeTargetDependsOnTargets
следующим образом:
<SomeTargetDependsOnTargets>
$(SomeTargetDependsOnTargets);Dependency3
</SomeTargetDependsOnTargets>
Проблема с этим дизайном состоит в том, что если бы автор просто вставил Dependency1;Dependency2
вместо того, чтобы извлекать его в свойство, не было бы никакого способа изменить его внешне, чтобы обеспечить возможность настройки.
AfterTargets
, с другой стороны, не требует, чтобы исходный целевой автор явно извлек значение DependsOnTargets
в свойство, чтобы обеспечить расширяемость.