Как запустить postaction, если в psake произошел сбой?

В нашем скрипте psake перед компиляцией мы запускаем файлы сборки check-out. когда задача компиляции будет успешно выполнена, сборки будут скопированы, а затем задача регистрации зафиксирует сборки.

Проблема с этим подходом заключается в том, что если этап компиляции остановлен, файлы будут сохранены для проверки.

Если задача компиляции не удалась, я хотел бы запустить другую задачу, чтобы отменить проверку файлов.

task CheckOutFiles -description "Checkout the files" `
    -precondition { $OutputFiles -ne $null } `
    -action {

    foreach( $file in $OutputFiles ) {
        exec { Checkout-File -FilePath $file }
    }
} 

task Compile `
    -depends Clean `
    -description "Compile the code" `
    -requiredVariables solutionFile, buildConfiguration `
{ 
    Write-Host "Building solution $solutionFile" | Out-Null

    Assert ( Test-Path $solutionFile ) "SolutionFile $SolutionFile is not found "
    Exec { msbuild $SolutionFile "/t:build" "/p:Configuration=$buildConfiguration"  }
} 

task UndoCheckOutFiles -description "UndoCheckout the files" `
    -precondition { $OutputFiles -ne $null } `
    -action {

    foreach( $file in $OutputFiles ) {
        exec { UndoCheckout-File -FilePath $file }
    }
} 

В задаче компиляции есть ли способ, чтобы в случае неудачи я мог запустить задачу UndoCheckoutFiles?


person Samselvaprabu    schedule 28.10.2016    source источник


Ответы (1)


Ключом к обоим приведенным ниже решениям является обработка исключений MSBuild с помощью попробовать/поймать/наконец-то.

Если вы хотите сохранить UndoCheckOutFiles как отдельную задачу, можно запустить вложенную сборку, которая сообщает о внешнем (Compile) сбое, но о внутреннем (UndoCheckOutFiles) успехе:

...
task Compile `
-depends Clean `
-description "Compile the code" `
-requiredVariables solutionFile, buildConfiguration `
{ 
    Write-Host "Building solution $solutionFile" | Out-Null
    Assert ( Test-Path $solutionFile ) "SolutionFile $SolutionFile is not found"
    Try 
    {
        Exec { msbuild $SolutionFile "/t:build" "/p:Configuration=$buildConfiguration" }
    }
    Catch
    {
        Write-Error $_;
    }
    Finally
    {
        Invoke-psake -taskList UndoCheckoutFiles
    }
} 

task UndoCheckOutFiles -description "UndoCheckout the files" `
-precondition { $OutputFiles -ne $null } `
-action {
    foreach( $file in $OutputFiles ) {
    exec { UndoCheckout-File -FilePath $file }
}

Для более чистого вывода сборки просто переместите действия UndoCheckOutFiles в задачу Compile:

...
task Compile `
-depends Clean `
-description "Compile the code" `
-requiredVariables solutionFile, buildConfiguration `
{ 
    Write-Host "Building solution $solutionFile" | Out-Null
    Assert ( Test-Path $solutionFile ) "SolutionFile $SolutionFile is not found"
    Try
    {
        Exec { msbuild $SolutionFile "/t:build" "/p:Configuration=$buildConfiguration" }
    }
    Catch
    {
        Write-Error $_;
    }
    Finally
    {
        foreach( $file in $OutputFiles ) {
            exec { UndoCheckout-File -FilePath $file }
        }
    }
}
person Bryan    schedule 28.12.2016