【问题标题】:Psake ignores properties and parametersPsake 忽略属性和参数
【发布时间】:2016-05-19 10:15:24
【问题描述】:

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

执行相对(在子文件夹中使用 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 传递给psake 的正确语法是什么?

【问题讨论】:

标签: build continuous-integration build-process psake


【解决方案1】:

我没有研究太久,但似乎只要您在属性中声明 $variable { ... here ... } 或在 Param (... here ... ) 中,因此 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"
}

调用代码示例(通过 Chocolatey 安装到 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 中的 Properties 函数第 256 行,注意它需要一个脚本块 args 并将其添加到 $psake 上的上下文堆栈上的属性数组中,此处仍然是脚本块

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 行将脚本块从参数和属性加载到作用域。

 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 方法,以便作用域可以将变量传递给它,应该注意。

【讨论】:

  • 我已经从您的后续问题中澄清了一些问题。您的所有示例都具有 Tasks 中的属性。我的问题是在根范围内没有填充任何内容以进行调试。
  • 今晚我会看看根范围问题,但请先尝试添加 $z 以确认仍然损坏。同时也只是一个建议,但为什么不在清理之前为您的全局范围创建一个任务?
  • 试过了,它不适用于根范围。我可以通过Task-scope 让它工作,但这个问题是关于强调为什么它在根范围内不起作用以及为什么文档中没有关于它的任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多