Build Psake忽略属性和参数

Build Psake忽略属性和参数,build,continuous-integration,build-process,psake,Build,Continuous Integration,Build Process,Psake,使用psake 4.5.0,我尝试以多种不同的方式运行我的default.ps1文件,传递-properties和-parameters,但是这些值在.ps1-script的根范围内被忽略 执行relative(在子文件夹中使用psake): .\psake-4.5.0\psake.ps1 .\default.ps1 BuildSolution -properties @{"a"="a";"b"="b";"c"="c";"d"="d"} -parameters @{"w"="w";"x"="x"

使用psake 4.5.0,我尝试以多种不同的方式运行我的
default.ps1
文件,传递
-properties
-parameters
,但是这些值在
.ps1
-script的根范围内被忽略

执行relative(在子文件夹中使用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"}
psake .\default.ps1 BuildSolution -properties "@{'a'='a';'b'='b';'c'='c';'d'='d'}" -parameters "@{'w'='w';'x'='x';'y'='y';'z'='z'}"
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'}"
使用导入的模块执行

.\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"}
psake .\default.ps1 BuildSolution -properties "@{'a'='a';'b'='b';'c'='c';'d'='d'}" -parameters "@{'w'='w';'x'='x';'y'='y';'z'='z'}"
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'}"
通过安装的巧克力包装执行:

.\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"}
psake .\default.ps1 BuildSolution -properties "@{'a'='a';'b'='b';'c'='c';'d'='d'}" -parameters "@{'w'='w';'x'='x';'y'='y';'z'='z'}"
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'}"
通过
cmd.exe执行

.\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"}
psake .\default.ps1 BuildSolution -properties "@{'a'='a';'b'='b';'c'='c';'d'='d'}" -parameters "@{'w'='w';'x'='x';'y'='y';'z'='z'}"
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:

属性
和/或
参数
传递给psake的正确语法是什么?

或者在Param(…这里…)中,所以psake可以填充它们,尽管它们很好。你错过了$z。除非我遗漏了一些关于为什么要同时使用参数和属性的基本信息

default.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"
}
调用代码示例(psake通过Chocolate安装到c:)

编辑:

这是psake.psm1中的
Properties
函数行256,注意它接受一个scriptblock args并将其添加到$psake上的上下文堆栈上的Properties数组中,这里仍然是脚本块

function Properties {
    [CmdletBinding()]
    param(
        [Parameter(Position=0,Mandatory=1)][scriptblock]$properties
    )
    $psake.context.Peek().properties += $properties
}
psake.psm1中的
Invoke psake
函数的第372行将默认的.ps1构建脚本加载到作用域中(此时您可以看到
write host
调用,但没有加载变量)

第394行和第397行将脚本块从参数和属性加载到范围

 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
            }
        }

第420行和第423行调用
invoke Task
(第198行),这反过来又使用了上面定义的变量,并且有一个断言,即此函数中的变量不为null


我不认为预期的用例会在脚本第一次出现时将这些变量加载到根范围中。源于作用域,然后它会抛出
写主机
调用,design可能希望您首先声明任务方法,以便作用域可以将变量传递给它,并且应该注意。

这有帮助吗@不是真的,这是一个非常理论化的例子,而我的例子非常具体。我已经从你的后续问题中澄清了这个问题。您的所有示例都具有任务中的属性。我的问题是根作用域中没有填充任何用于调试的内容。今晚我将查看根作用域的问题,但尝试先添加$z以确认是否仍然损坏。同时也只是一个建议,但为什么不在清理之前为您的全局作用域运行一个任务呢?尝试过了,但它对根作用域不起作用。我可以通过
Task
-scope使它工作,但是这个问题是关于强调为什么它在根作用域中不工作,以及为什么文档中没有关于它的内容。