2016-10-28 8 views
1

psakeスクリプトでは、コンパイルの前にチェックアウトのアセンブリファイルを実行しています。 コンパイルタスクが正常に完了すると、アセンブリがコピーされ、チェックインタスクがアセンブリをコミットします。psakeで障害が発生した場合のpostactionを実行するには?

この方法で問題が発生するのは、コンパイルステップが停止されていれば、ファイルはチェックアウトされたままになります。

コンパイルタスクが失敗した場合は、ファイルのチェックアウトを取り消す別のタスクを実行したいと思います。

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タスクを実行できますか?

答えて

0

以下の両方の解決策のキーは、MSBuildの例外をtry/catch/finallyで処理することです。

あなたは別のタスクとして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 } 
     } 
    } 
} 
関連する問題