Определите, компилируется ли решение с использованием MSBuild и PSake - PullRequest
3 голосов
/ 01 декабря 2009

Я собрал сценарий сборки PSake (v2.0), и сценарий устанавливает свойство $psake.build_success как true, даже если вызов MSBuild завершится неудачно. Может кто-нибудь посоветовать мне, как изменить скрипт, чтобы свойство $psake.build_success правильно возвращало false при сбое вызова MSBuild?

Мой скрипт сборки 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
    }
}

Ответы [ 4 ]

3 голосов
/ 01 декабря 2009

Похоже, проблема заключается в том, что вызов операции MSBuild фактически завершается успешно, в то время как инициируемая операция сборки завершается неудачей. Я смог обойти это, направив вывод вызова 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)
}
3 голосов
/ 01 декабря 2009

Является ли родной для PowerShell $lastExitCode (то есть WIn32 ExitCode) какое-либо использование в контексте? Я бы предположил, что встроенный является релевантным, только когда вы вызываете командлет, связанный с psake.

т.е. заменить чек на

if($lastexitcode -eq 0) {

Отказ от ответственности: только опыт подкаста с psake: D

1 голос
/ 03 апреля 2016

Существует команда psake Exec , которую вы можете обернуть msbuild, и выдается ошибка powershell.

Exec {
     msbuild $solutionFile "/p:Configuration=$buildConfiguration;Platform=$buildPlatform;OutDir=$tempOutputDirectory"
}
0 голосов
/ 30 января 2014

Ни $ 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. Если вы используете это в работе, я рекомендую добавить обработку -timeout в Wait-Process

...