我的构建服务器上正在运行以下 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.exe
和 Releases
文件。为什么此 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/