2009-12-01 1 views
3

나는 PSake (v2.0) 빌드 스크립트를 작성했으며 스크립트는 true으로 $psake.build_success 속성을 MSBuild에 대한 호출이 실패한 것으로 생각하더라도 설정합니다. 누구든지 $psake.build_success 속성이 올바르게 false MSBuild 호출이 실패 할 때 반환 할 수 있도록 스크립트를 변경하는 방법에 대한 조언을 수 있습니까? 다음과 같이해결 방법 결정 MSBuild 및 PSake를 사용하여 컴파일

내 PSake 빌드 스크립트는 다음과 같습니다

properties { 
    $solutionFile = 'SOLUTION_FILE' 
    $buildSuccessfulMessage = 'Solution Successfully Built!' 
    $buildFailureMessage = 'Solution Failed to Build!' 
    $cleanMessage = 'Executed Clean!' 
} 

task default -depends BuildSolution 

task BuildSolution 
{ 
    msbuild $solutionFile /t:Clean,Build 
    if ($psake.build_success) 
    { 
     $buildSuccessfulMessage 
    } 
    else 
    { 
     $buildFailureMessage 
    } 
} 
+3

현재 psake에는 '{'매달 기가 내용을 표시하고 실행하지 않는 버그가 있습니다. 그래서'task BuildSolution {'으로 바꾸면보다 나은 결과를 얻을 수 있습니다. –

+0

브렛, 많은 정보 주셔서 감사합니다. 아래 대답으로 남겨두면 공식 응답으로 받아 들일 것입니다. – MagicAndi

답변

3

인가 PowerShell에서의 기본 $lastExitCode (즉,은 WIN32가 ExitCode) 컨텍스트의 모든 사용? 나는 psake 관련 cmdlet을 호출 할 때만 내장 된 것으로 간주 할 것입니다.

것은 즉,

if($lastexitcode -eq 0) { 

포기와 함께 수표를 대체 : psake 만 팟 캐스트 수준의 경험을 : D 문제는 MSBuild에서 작업에 대한 호출이 실제로 성공적으로 완료 것 같다

+1

Ruben, MSBuild에 대한 실제 호출이 실제로 성공했으나 시작된 빌드 작업이 실패했기 때문에 Ruben이 작동하지 않습니다. +1 유용한 코드 스 니펫에 대해 앞으로 사용하게 될 것입니다. – MagicAndi

+1

나는 msbuild가'lastExitCode'를 설정해야한다는 것을 확신합니다 - 얼마나 많은 레벨을 시도합니까? 일반적으로 모든 msbuild 실행 오류가 발생합니다 (즉, 실패한 모든 하위 빌드가 0이 아닌 종료 코드를 반환하고 이로 인해 오류가 발생하는 등). 개념에 대해 설명합니다. - http://code.google.com/p/psake/issues/detail? id = 9 –

3

을 빌드 작업 동안 실패를 시작합니다. 이 문제를 해결할 수 있었던 방법은 MSBuild 호출의 출력을 텍스트 파일로 파이프 한 다음 "Build Failed"문자열에 대한 파일을 구문 분석하는 것입니다. 문자열에 문자열이 포함되어 있으면 빌드가 실패한 것입니다. 다음과 같이

내 PSake 빌드 스크립트는 다음과 같습니다

properties { 
    $solutionFile = 'SOLUTION_FILE' 
    $buildSuccessfulMessage = 'Solution Successfully Built!' 
    $buildFailureMessage = 'Solution Failed to Build!' 
    $cleanMessage = 'Executed Clean!' 
} 

task default -depends Build 

task Build -depends Clean { 
    msbuild $solutionFile /t:Build /p:Configuration=Release >"MSBuildOutput.txt" 
} 

task Clean { 
    msbuild $solutionFile /t:Clean 
} 

내 호출 스크립트

:

function Check-BuildSuccess() 
{ 
    return (! (Find-StringInTextFile -filePath .\MSBuildOutput.txt -searchTerm "Build Failed")) 
} 

function Is-StringInTextFile 
(
    [string]$filePath = $(Throw "File Path Required!"), 
    [string]$searchTerm = $(Throw "Search Term Required!") 
) 
{ 
    $fileContent = Get-Content $filePath  
    return ($fileContent -match $searchTerm) 
} 
0

$ LastExitCode 또는 $ _ 나를 위해 일한 어느. 그러나 :

$buildArgs = "MySolution.sln", "/t:Build", "/p:Configuration=Debug" 
$procExitCode = 0 
$process = Start-Process -FilePath "msbuild" -ArgumentList $buildArgs -NoNewWindow -PassThru 
Wait-Process -InputObject $process 
$procExitCode = $process.ExitCode 

#aha! msbuild sets the process exit code but powershell doesn't notice 
if ($procExitCode -ne 0) 
{ 
    throw "msbuild failed with exit code $procExitCode." 
} 

P.S. 이것을 프로덕션 환경에서 사용하는 경우 Wait-Process에 -timeout 처리를 추가하는 것이 좋습니다.

1

psbu Exec 명령을 사용하면 msbuild를 감싸고 powershell 오류가 발생합니다.

Exec { 
    msbuild $solutionFile "/p:Configuration=$buildConfiguration;Platform=$buildPlatform;OutDir=$tempOutputDirectory" 
}