【问题标题】:Squirrel Powershell file is not creating the Setup.exeSquirrel Powershell 文件未创建 Setup.exe
【发布时间】:2017-02-13 23:22:34
【问题描述】:

我的构建服务器上正在运行以下 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 
}

它运行并且它只在.\Releases 文件夹中创建一个nupkg。如果我在构建服务器代理上的 Visual Studio 实例中运行相同的 --releasify 命令,它会创建所有 setup.exeReleases 文件。为什么这个 PowerShell 脚本的工作方式与在 VS 的 NuGet PowerShell 窗口中运行的命令不同?

【问题讨论】:

    标签: c# powershell continuous-delivery squirrel.windows


    【解决方案1】:

    我没有玩过 Squirrel,所以这可能行不通;但是这里的代码太多,只能作为评论提交......

    试试这个:

    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'
    

    【讨论】:

    • 抱歉回复迟了,我赶上然后累了。我现在正在尝试这个。关于“第一”命令的一个问题......是否可以执行“最后”命令以便选择具有更高版本号的文件夹?
    • 这些更改似乎在构建服务器上完成了与我的代码相同的事情。它们是升级版,但不能解决我的松鼠问题。
    • 嘿@PlTaylor;很遗憾听到这没有解决您的问题。关于-Last;绝对会做你想要的。即1..10 | select -Last 1 返回10
    • 好点;它会按字符串顺序对事物进行排序;所以上面的例子都可以,因为它们在字符串和数字顺序上是相同的;但是在某些情况下这不起作用;即1, 10, 11, 2, 3 按字母数字顺序而不是数字顺序排序。如果这些字符串的格式一致,则可能有一种解决方法;即使用正则表达式提取版本号,转换为数字,然后对其进行排序;但需要调整...今晚将看看松鼠路径是什么样的...
    • 仍然比任何其他方法更有可能做我真正想做的事情 :) 只是试图排列可能的失败原因。
    【解决方案2】:

    我找到了答案here

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多