Почему моя цель не выполнена?

У меня есть следующий файл целей, который импортируется в мой .csproj файл, одна из целей (AfterAddPostAction) никогда не срабатывает. Почему бы и нет? (Извините, это настолько многословно, но MSBuild - дерьмо в абстракции, и CallTask ​​не видит значений свойств, установленных внутри Target, содержащих элемент CallTask.)

<?xml version="1.0" encoding="Windows-1252"?>

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="EstablishLog">
    <MakeDir Condition="!Exists('$(MSBuildProjectDirectory)\Logs')" Directories=".\Logs"/>
    <PropertyGroup>
      <PowerShellExe Condition=" '$(PowerShellExe)'=='' ">%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe</PowerShellExe>
      <ScriptPath Condition=" '$(ScriptPath)'=='' ">C:\Users\Admin\Documents\GitHub\powershell-scripts\</ScriptPath>
      <LogState>$(ScriptPath)ProjectSnapShot.ps1</LogState>
      <DoPostAction>$(ScriptPath)postAction-BeforePublish.ps1</DoPostAction>
      <Switches>-NonInteractive -executionpolicy Unrestricted</Switches>
      <Arguments>&quot;&amp; { &amp;&apos;$(ScriptPath)&apos; } &quot;</Arguments>
    </PropertyGroup>
  </Target>

  <Target Name="AfterClean" DependsOnTargets="EstablishLog">
    <PropertyGroup>
      <LogFile >AfterClean$(ApplicationVersion).log</LogFile>
      <LogFile Condition="Exists('$(MSBuildProjectDirectory)\Logs')">.\Logs\$(LogFile)</LogFile>
      <Arguments>&quot;&amp; { &amp;&apos;$(LogState)&apos; } &quot;</Arguments>
    </PropertyGroup>
    <Exec Command="$(PowerShellExe) $(Switches) -command $(Arguments) &gt; $(LogFile)" />
  </Target>

  <Target Name="BeforeBuild" DependsOnTargets="EstablishLog">
    <PropertyGroup>
      <LogFile >BeforeBuild$(ApplicationVersion).log</LogFile>
      <LogFile Condition="Exists('$(MSBuildProjectDirectory)\Logs')">.\Logs\$(LogFile)</LogFile>
      <Arguments>&quot;&amp; { &amp;&apos;$(LogState)&apos; } &quot;</Arguments>
    </PropertyGroup>
    <Exec Command="$(PowerShellExe) $(Switches) -command $(Arguments) &gt; $(LogFile)" />
  </Target>

  <Target Name="AfterBuild" DependsOnTargets="EstablishLog">
    <PropertyGroup>
      <LogFile >AfterBuild$(ApplicationVersion).log</LogFile>
      <LogFile Condition="Exists('$(MSBuildProjectDirectory)\Logs')">.\Logs\$(LogFile)</LogFile>
      <Arguments>&quot;&amp; { &amp;&apos;$(LogState)&apos; } &quot;</Arguments>
    </PropertyGroup>
    <Exec Command="$(PowerShellExe) $(Switches) -command $(Arguments) &gt; $(LogFile)" />
  </Target>

  <Target Name="BeforePublish" DependsOnTargets="EstablishLog">
    <PropertyGroup>
      <LogFile >BeforePublish$(ApplicationVersion).log</LogFile>
      <LogFile Condition="Exists('$(MSBuildProjectDirectory)\Logs')">.\Logs\$(LogFile)</LogFile>
      <Arguments>&quot;&amp; { &amp;&apos;$(LogState)&apos; } &quot;</Arguments>
    </PropertyGroup>
    <Exec Command="$(PowerShellExe) $(Switches) -command $(Arguments) &gt; $(LogFile)" />
  </Target>

  <Target Name="AddPostAction" AfterTargets="BeforePublish" DependsOnTargets="EstablishLog">
    <PropertyGroup>
      <PostAction>FileCopyPDA.FileCopyPDA</PostAction>
      <Arguments>&quot;&amp; { &amp;&apos;$(DoPostAction)&apos; &apos;$(PostAction)&apos; $(Configuration)} &quot;</Arguments>
      <LogFile >AddPostAction$(ApplicationVersion).log</LogFile>
      <LogFile Condition="Exists('$(MSBuildProjectDirectory)\Logs')">.\Logs\$(LogFile)</LogFile>
    </PropertyGroup>
    <Exec Command="$(PowerShellExe) $(Switches) -command $(Arguments) &gt; $(LogFile)" />
  </Target>

  <!--This one is never called-->
  <Target Name="AfterAddPostAction" DependsOnTargets="EstablishLog;AddPostAction">
    <PropertyGroup>
      <LogFile >AfterAddPostAction$(ApplicationVersion).log</LogFile>
      <LogFile Condition="Exists('$(MSBuildProjectDirectory)\Logs')">.\Logs\$(LogFile)</LogFile>
      <Arguments>&quot;&amp; { &amp;&apos;$(LogState)&apos; } &quot;</Arguments>
    </PropertyGroup>
    <Exec Command="$(PowerShellExe) $(Switches) -command $(Arguments) &gt; $(LogFile)" />
  </Target>

  <Target Name="AfterPublish" DependsOnTargets="EstablishLog">
    <PropertyGroup>
      <LogFile >AfterPublish$(ApplicationVersion).log</LogFile>
      <LogFile Condition="Exists('$(MSBuildProjectDirectory)\Logs')">.\Logs\$(LogFile)</LogFile>
      <Arguments>&quot;&amp; { &amp;&apos;$(LogState)&apos; } &quot;</Arguments>
    </PropertyGroup>
    <Exec Command="$(PowerShellExe) $(Switches) -command $(Arguments) &gt; $(LogFile)" />
  </Target>

</Project>

1 ответ

Решение

DependsOnTargets это основной способ цепочки задач в последовательности. Но если у вас есть последовательность A->B->C осуществляется через DependsOnTargets (B зависит от A) и вызов цели A, затем B а также C не будет выполнен Но если вы позвоните Cтогда оба A а также B выполнены.

Наоборот, цель, которая имеет цель A упоминается в AfterTargets атрибут будет выполнен после A выполнен.

Вот почему в вашем случае, если вы хотите использовать DependsOnTargets важно, какую цель вы выполняете.

Другие вопросы по тегам