2016-06-06 13 views
0

У меня есть AfterBuild задания, которое подписывает DLL с помощью signtool.exe с помощью пакета NuGet MSBuild.ExtensionPackMSBuild - Запуск альтернативной задачи, если задача не

<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 и, следовательно, SDK Windows) эта задача терпит неудачу, если агент имеет версию SDK версии 8.0.

Можно ли запускать другую задачу тогда и только тогда, когда задача не выполняется?

т.е. если выше задача не выполнена, запустите альтернативную задачу, которая имеет другой путь к signtool.exe

ответ

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' " /> 
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