MSBuild - 如果任务失败,则运行备用任务

时间:2016-06-06 16:25:09

标签: msbuild msbuild-task msbuildextensionpack

我有一个AfterBuild任务,通过NuGet包signtool.exe使用MSBuild.ExtensionPack签署dll

<MSBuild.ExtensionPack.Framework.CommandLine Command="&quot;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe&quot; sign &quot;/n&quot; &quot;MY CERTIFICATE&quot; &quot;/t&quot; &quot;http://timestamp.comodoca.com/authenticode&quot; &quot;$(TargetPath).&quot;" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " />

由于构建环境之间存在一些差异(某些远程构建代理具有不同版本的Visual Studio,因此Windows SDK),当代理安装了SDK 8.0版时,此任务将失败。

当且仅当任务失败时,是否可以触发不同的任务?

即。如果上述任务失败,请运行具有signtool.exe

的不同路径的备用任务

2 个答案:

答案 0 :(得分:1)

作为替代解决方案,我已经提出以下内容来检查可能的路径并使用找到的最新版本:

<PropertyGroup>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe')">C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Windows Kits\8.1\bin\x86\signtool.exe')">C:\Program Files (x86)\Windows Kits\8.1\bin\x86\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool.exe')">C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe')">C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe')">C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\signtool.exe')">C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\signtool.exe')">C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\signtool.exe')">C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\signtool.exe</SignToolPath>
</PropertyGroup>
<Error Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == ''" Text="Unable to determine signtool path" />
<MSBuild.ExtensionPack.Framework.CommandLine Command="&quot;$(SignToolPath)&quot; sign &quot;/n&quot; &quot;MY CERTIFICATE&quot; &quot;/t&quot; &quot;http://timestamp.comodoca.com/authenticode&quot; &quot;$(TargetPath).&quot;" Condition=" '$(Configuration)' == 'Release' " />

答案 1 :(得分:0)

您可以使用ContinueOnError="true"标记您的任务,然后使用MSBuildLastTaskResult保留属性来检查您的任务是否成功。

类似的东西:

<MSBuild.ExtensionPack.Framework.CommandLine
    ContinueOnError="true"
    Command="path_to_signtool.exe"
    .... />
<MSBuild.ExtensionPack.Framework.CommandLine
    Condition="'$(MSBuildLastTaskResult)' == 'False'"
    Command="another_path_to_signtool.exe"
    .... />

另见this answer