Использование MSBuild из PowerShell возвращает ошибку VCBuild не загружен
Я пытаюсь запустить сборку на нескольких решениях Visual Studio 2005 из скрипта PowerShell, и она возвращает эту ошибку:
MSBUILD: ошибка MSB3428: не удалось загрузить компонент Visual C++ "VCBuild.exe". Чтобы это исправить, 1) установите.NET Framework 2.0 SDK, 2) установите Microsoft Visual Studio 2005 или 3) добавьте расположение компонента в системный путь, если он установлен в другом месте. [C:\ путь \ к \ решения \solutionToBuild.sln] Готово Создание проекта "C:\path\to\solution\solutionToBuild.sln" (цели по умолчанию) - СБОЙ. Сборка не удалась. "C:\path\to\solution\solutionToBuild.sln" (цель по умолчанию) (1) -> (targetToBuild target) -> MSBUILD: ошибка MSB3428: не удалось загрузить компонент Visual C++ "VCBuild.exe". Чтобы это исправить, 1) установите.NET Framework 2.0 SDK, 2) установите Microsoft Visual Studio 2005 или 3) добавьте расположение компонента на системный путь, если он установлен в другом месте. [C:\ путь \ к \ решения \solutionToBuild.sln] 0 Предупреждение (я) 1 ошибка Прошедшее время 00:00:00.84
Я действительно понятия не имею, почему это сообщение возвращается, так как у меня установлен MSVS 2005 и у меня установлен.NET V2:
PSChildName Версия выпуска продукта ----------- ------- ------- ------- v2.0.50727 2.0.50727.5420 v3.0 3.0.30729.5420 Windows Communication Foundation 3.0.4506.5420 Windows Presentation Foundation 3.0.6920.5011 v3.5 3.5.30729.5420 Клиент 4.6.01590 394806 4.6.2 Полный 4.6.01590 394806 4.6.2 Клиент 4.0.0.0
Возможно, мне нужно что-то добавить в путь к системной среде, но в сообщении об ошибке не сказано, что добавить, поэтому я немного растерялся.
1 ответ
В итоге я полностью изменил написанную мной функцию, и вот что я придумал (что сработало для меня):
function Build-MSVS2K5Solution {
param (
[parameter(mandatory=$true)][validateNotNullOrEmpty()][String] $solutionToBuild,
[parameter(mandatory=$true)][validateNotNullOrEmpty()][Array] $solutionEnv,
[parameter(mandatory=$false)][validateNotNullOrEmpty()][Switch] $autoOpenBuildLog = $false
)
process {
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup("Please wait while solutions are being rebuilt.",0,"Building Solution...",0x1)
cd "C:\"
if (Test-Path "C:\Windows\Microsoft.NET\Framework\v2.0.50727")
{
$msBuild = "C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe"
}
$buildArgs = $solutionToBuild + (Get-ChildItem $SolutionToBuild | Where { $_.Name -like "*.sln" }) +" /p:Configuration=Debug /p:Platform=Win32"
$buildLog = [Environment]::GetFolderPath("Desktop") + "\buildlog.log"
foreach ($solEnv in $solutionEnv ) {
$itemPath = "env:" + $solEnv.Substring(0, ($solEnv.ToString().LastIndexOf("=") ) )
$itemValue = $solEnv.Substring( ($solEnv.ToString().LastIndexOf("=")+1) )
Set-Item -Path $itemPath -Value $itemValue
}
Write-Output "Building $buildArgs..."
Start-Process -FilePath $msBuild -ArgumentList $buildArgs -RedirectStandardOutput $buildLog
if ($autoOpenBuildLog)
{
Write-Output "Getting content of : $buildLog"
Get-Content $buildLog -Tail 1 -Wait
}
}
}
$solutionEnv = "envName=envValue", "envName2=envValue2", "etc.=etc."
Build-MSVS2K5Solution -SolutionToBuild "C:\Path\to\solution\" -solutionEnv $solutionEnv -autoOpenBuildLog
Это не идеально, но это работает. По сути, я отправляю путь к решению, функция находит решение "*.sln" (я знаю, что директория решения содержит только один). Он устанавливает переменные среды, полученные в строке, затем запускает сборку, и если вызывается $ autoOpenBuildLog, buildLog печатается в приглашении powershell.
Не стесняйтесь, дайте мне знать, если у вас есть предложения по улучшению кода!
Спасибо, Дэвид Даугерти и @stijn!