2

我的构建服务器上正在运行以下 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.exeReleases文件。为什么这个 PowerShell 脚本的工作方式与在 VS 的 NuGet PowerShell 窗口中运行的命令不同?

4

2 回答 2

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'
于 2017-02-09T22:18:19.370 回答
1

我在这里找到了答案

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 代码。

于 2017-02-13T15:22:34.380 回答