gpt4 book ai didi

build - Psake 忽略属性和参数

转载 作者:行者123 更新时间:2023-12-04 16:07:35 24 4
gpt4 key购买 nike

使用 psake 4.5.0 我试图运行我的 default.ps1归档许多不同的方式,通过 -properties-parameters , 但这些值会被忽略 在根范围内 .ps1 -脚本。

执行相对(在子文件夹中使用 psake) :

.\psake-4.5.0\psake.ps1 .\default.ps1 BuildSolution -properties @{"a"="a";"b"="b";"c"="c";"d"="d"} -parameters @{"w"="w";"x"="x";"y"="y";"z"="z"}

使用导入的模块执行 :
Import-Module .\psake-4.5.0\psake.psm1

Invoke-Psake .\default.ps1 BuildSolution -properties @{"a"="a";"b"="b";"c"="c";"d"="d"} -parameters @{"w"="w";"x"="x";"y"="y";"z"="z"}

通过已安装的 Chocolatey-package 执行:
psake .\default.ps1 BuildSolution -properties "@{'a'='a';'b'='b';'c'='c';'d'='d'}" -parameters "@{'w'='w';'x'='x';'y'='y';'z'='z'}"

通过cmd.exe执行 :
psake-4.5.0\psake.cmd default.ps1 BuildSolution -properties "@{'a'='a';'b'='b';'c'='c';'d'='d'}" -parameters "@{'w'='w';'x'='x';'y'='y';'z'='z'}"

现在, default.ps1只是调试所有这些值:
// Since "properties" doesn't get populated, I also try "Param"
Param(
$w = $w, // Trying to populate from passed param
$x = $null, // Trying to default to null-value
$y // Trying another syntax, hoping for population
// "$z" left out, hoping for population
)

properties {
$a = $a
$b = $null
$c
}

Write-Host "a: $a"
Write-Host "b: $b"
Write-Host "c: $c"
Write-Host "d: $d"
Write-Host "w: $w"
Write-Host "x: $x"
Write-Host "y: $y"
Write-Host "z: $z"

Task BuildSolution -Depends Clean {
Write-Host "Running BuildSolution"
}

Task Clean {
Write-Host "Running Clean"
}

在所有情况下,输出都是:
a: 
b:
c:
d:
w:
x:
y:
z:

传递 properties 的正确语法是什么?和/或 parameters假装?

最佳答案

我没有研究太久,但似乎只要您在属性中声明 $variable { ... here ... }
或在 Param (... here ... ) 中,因此 psake 可以填充它们,尽管它们还可以。你错过了 $z。除非我错过了关于为什么一起使用参数和属性的基本知识?

默认.ps1

properties {
$a = $null,
$b = $null,
$c = $null,
$w = $null,
$x = $null,
$y = $null,
$z = $null
}

Task default -Depends BuildSolution

Task BuildSolution -Depends Clean {
Write-Host "Running BuildSolution"
echo "x -> $x"
echo "y -> $y"
echo "z -> $z"
}

Task Clean {
Write-Host "Running Clean"
echo "a -> $a"
echo "b -> $b"
echo "c -> $c"
}

调用代码示例(通过巧克力安装到 c:)
Import-Module C:\ProgramData\chocolatey\lib\psake\tools\psake.psm1

Invoke-Psake .\default.ps1 BuildSolution -properties @{'a'="a";"b"="b";"c"="c";'x'="x";'y'="y";'z'="z"}

编辑:

这是 psake.psm1 中第 256 行的 Properties 函数,注意它需要一个脚本 block args 并将其添加到 $psake 上的上下文堆栈上的属性数组中,这里仍然是脚本 block
function Properties {
[CmdletBinding()]
param(
[Parameter(Position=0,Mandatory=1)][scriptblock]$properties
)
$psake.context.Peek().properties += $properties
}

psake.psm1 中 Invoke-psake 函数的第 372 行将您的 default.ps1 构建脚本加载到作用域(此时您会看到 write-host 调用但没有加载变量)
. $psake.build_script_file.FullName

第 394 行和第 397 行将脚本 block 从参数和属性加载到范围。
 foreach ($key in $parameters.keys) {
if (test-path "variable:\$key") {
set-item -path "variable:\$key" -value $parameters.$key -WhatIf:$false -Confirm:$false | out-null
} else {
new-item -path "variable:\$key" -value $parameters.$key -WhatIf:$false -Confirm:$false | out-null
}
}

...
foreach ($key in $properties.keys) {
if (test-path "variable:\$key") {
set-item -path "variable:\$key" -value $properties.$key -WhatIf:$false -Confirm:$false | out-null
}
}

第 420 行和第 423 行调用 invoke-Task(第 198 行),后者又使用上面定义的变量,还有一个断言该函数中的变量不为空。

我不认为预期的用例涉及将这些变量加载到根范围内,当脚本是 first 时。源自作用域它会吐出 write-host 调用然后,设计可能打算让您首先声明 Task 方法,以便作用域可以将变量传递给它,应该注意。

关于build - Psake 忽略属性和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35291866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com