Белка Powershell не создает файл Setup.exe

У меня на сервере сборки работает следующий скрипт PowerShell

Write-Host "Current Path  $env:Agent_BuildDirectory"
Write-Host "Build Number  $env:Build_BuildNumber"
$squirrel = "$env:BUILD_SOURCESDIRECTORY\packages\squirrel.windows.*\tools\Squirrel.exe"
$releaseDir = '.\Releases'
$nugetPackFile = ".\MyApp\MyApp.$env:Build_BuildNumber.nupkg"
Write-Host $squirrel
Write-Host $nugetPackFile

if((Test-Path $nugetPackFile) -and (Test-Path $squirrel)) {
    $squirrelArg1 = '--releasify=' + $nugetPackFile
    $squirrelArg2 = '--releaseDir=' + $releaseDir
    & $squirrel $squirrelArg1 $squirrelArg2 
}

Он работает и создает только nupkg в .\Releases папка. Если я бегу так же --releasify Команда в экземпляре Visual Studio на моем агенте сервера сборки создает все setup.exe а также Releases файл. Почему этот сценарий PowerShell не работает так же, как команда, запускаемая в окне NuGet PowerShell в VS?

2 ответа

Я не играл с Белкой, так что это может не сработать; но слишком много кода здесь, чтобы просто отправить как комментарий...

Попробуй это:

Write-Host "Current Path  $env:Agent_BuildDirectory"
Write-Host "Build Number  $env:Build_BuildNumber"
$squirrel = Get-Item (Join-Path $env:BUILD_SOURCESDIRECTORY "packages\squirrel.windows.*\tools\Squirrel.exe") | select -First 1 -Expand FullName
$releaseDir = '.\Releases'
$nugetPackFile = ".\MyApp\MyApp.$env:Build_BuildNumber.nupkg"
Write-Host $squirrel
Write-Host $nugetPackFile

if((Test-Path $nugetPackFile) -and (Test-Path $squirrel)) {
    $squirrelArg1 = "--releasify=`"$nugetPackFile`""
    $squirrelArg2 = "--releaseDir=`"$releaseDir`""
    & $squirrel $squirrelArg1 $squirrelArg2 
}

Получение пути Squirrel.exe

  • (Join-Path $env:BUILD_SOURCESDIRECTORY "packages\squirrel.windows.*\tools\Squirrel.exe") - здесь я использую Join-Path чтобы избежать каких-либо проблем вокруг того, является ли ценность $env:BUILD_SOURCESDIRECTORY заканчивается обратной косой чертой.
  • Get-Item - Я поставил это перед этим путем, чтобы он разрешил путь к допустимому пути (т. Е. Определяя любые совпадения звездочки / подстановочного знака).
  • | select -First 1 -Expand FullName Затем я добавляю это, чтобы получить первый путь, соответствующий результату, и вернуть полный путь к файлу squirrel.exe

Передача параметров

Для приведенных ниже утверждений я добавил двойные кавычки вокруг путей; иногда требуется уточнить, к какому аргументу они относятся; особенно если в путях есть пробелы или специальные символы. Я также перешел от использования + помещать переменную в двойные кавычки, так как это упрощает объединение кавычек в строке. Я использовал обратные кавычки в кавычках в строке, чтобы избежать этих символов.

  • $squirrelArg1 = "--releasify=`"$nugetPackFile`""
  • $squirrelArg2 = "--releaseDir=`"$releaseDir`""

Надеюсь, что это помогает, но, к сожалению, я очень догадываюсь об этом; извиняюсь.


Обновить

Получение последней версии; принимая звездочку на пути packages\squirrel.windows.*\tools\Squirrel.exe представляет номер версии в форме: Major,Minor,Build,

$squirrel = Get-Item (Join-Path $env:BUILD_SOURCESDIRECTORY "packages\squirrel.windows.*\tools\Squirrel.exe") | %{
    if ($_ -match '.*\\squirrel\.windows\.(?<Major>\d+)\.(?<Minor>\d+)\.(?<Build>\d+)\\tools\\Squirrel\.exe') {
        (new-object -TypeName PSObject -Property $matches)
    }
} | sort @{e={$_.Major};a=0}, @{e={$_.Minor};a=0}, @{e={$_.Build};a=0} | select -First 1 -ExpandProperty '0'

Я нашел ответ здесь

Write-Host "Current Path  $env:Agent_BuildDirectory"
Write-Host "Build Number  $env:Build_BuildNumber"

$squirrel = Get-Item (Join-Path $env:BUILD_SOURCESDIRECTORY "packages\squirrel.windows.*\tools\Squirrel.exe") | %{
if ($_ -match '.*\\squirrel\.windows\.(?<Major>\d+)\.(?<Minor>\d+)\.(?<Build>\d+)\\tools\\Squirrel\.exe') {
    (new-object -TypeName PSObject -Property $matches)
    }
} | sort @{e={$_.Major};a=0}, @{e={$_.Minor};a=0}, @{e={$_.Build};a=0} | select -First 1 -ExpandProperty '0'

Set-Alias Squirrel $squirrel

$releaseDir = '.\Releases'
$nugetPackFile = ".\MyApp\MyApp.$env:Build_BuildNumber.nupkg"
Write-Host $squirrel
Write-Host $nugetPackFile

if((Test-Path $nugetPackFile) -and (Test-Path $squirrel)) {
    Squirrel --releasify $nugetPackFile --releaseDir $releaseDir | Write-Output
}

Большое спасибо @JohnLBevan за помощь в исправлении моего кода powershell.

Другие вопросы по тегам