c# - Squirrel Powershell 文件未创建 Setup.exe

标签 c# powershell continuous-delivery squirrel.windows

我的构建服务器上正在运行以下 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 窗口中运行的命令不同?

最佳答案

我没有玩过 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路径

  • (加入路径 $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 .构建

$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'

关于c# - Squirrel Powershell 文件未创建 Setup.exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42147180/

相关文章:

c# - 对应用于 MongoDB 中数组元素中每个项目的函数进行排序

c# - 如何合成两个图像(使用 Source In 合成)?

powershell - 如何计算文本文件中的行数并将它们存储在单个文件中?

powershell - 导出-PfxCertificate : Cannot export non-exportable private key

git - 使用 git-flow 进行持续集成和持续交付

c# - 如何在 Entity Framework 连接字符串中设置转换零日期时间

c# - 无法使用 IOptionsMonitor 检测 ASP.NET Core 中的更改

powershell - 无法识别Powershell工作流程命令

meteor - 如何使用 Gitlab CI/CD 部署 meteor 项目?

java - 如何使Jenkins认为Maven -SNAPSHOT jar Artifact 的两个不同版本与连续交付的一部分相同?