2016-02-09 6 views
6

Mit psake 4.5.0 Ich habe versucht, meine default.ps1 Datei viele verschiedene Möglichkeiten, zu laufen, sowohl -properties und -parameters vorbei, aber diese Werte sind nur im Root-scope der .ps1 ignoriert -Skript.Psake ignoriert Eigenschaften und Parameter

relativ Execute (mit psake in einem Unterordner):

.\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"} 

Execute mit importiertem Modul:

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

Ausführen durch installiert Chocolatey-Paket:

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

durch cmd.exe Execute:

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

Gerade jetzt ist die default.ps1 einfach nur alle diese Werte Debuggen:

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

Der Ausgang ist in allen Fällen:

a: 
b: 
c: 
d: 
w: 
x: 
y: 
z: 

Was ist die richtige Syntax, um properties und/oder parameters an psake zu übergeben?

+0

hilft das überhaupt? https://github.com/psake/psake/tree/master/examples/passingParametersString –

+0

@ almog.ori Nicht wirklich, es ist ein sehr theoretisches Beispiel, während mein sehr konkret ist. –

Antwort

0

Ich habe nicht zu lange darüber nachgedacht, aber es scheint so lange, wie Sie die $ Variable in Eigenschaften {... hier ...} oder in Param (... hier ...) deklarieren, also psake können bevölkern sie, sie kommen aber in Ordnung. Du hast $ z verpasst. Es sei denn, ich vermisse etwas Grundlegendes darüber, warum Sie Parameter und Eigenschaften zusammen verwenden?

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

invoke Codebeispiel (psake über chocolatey bis C installiert :)

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

EDIT:

Dies ist die Funktion Properties Leitung 256 in psake .psm1, beachten Sie, dass es einen scriptblock args benötigt und fügt es zum Eigenschaftenarray im Kontextstapel von $ psake, immer noch sc, hinzu ript Blöcke hier

function Properties { 
    [CmdletBinding()] 
    param(
     [Parameter(Position=0,Mandatory=1)][scriptblock]$properties 
    ) 
    $psake.context.Peek().properties += $properties 
} 

Linie 372 von Invoke-psake Funktion in psake.psm1 Lädt Ihre default.ps1 Build-Skript zu Umfang (an dieser Stelle Sie Ihre write-host Anrufe sehen aber keine Variablen geladen)

. $psake.build_script_file.FullName 

Linie 394 und Zeile 397 Lädt die Skriptblöcke von Parametern und Eigenschaften in den Bereich.

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

Leitung 420 und 423 Anrufe invoke-Task (Linie 198), die wiederum die Variablen oben definiert verwendet, ebenfalls gibt es eine assert, dass die Variablen in dieser Funktion nicht null sind .

Ich glaube nicht, dass der erwartete Anwendungsfall das Laden dieser Variablen in den root-Bereich beinhaltete, wenn das Skript zuerst war. in den Geltungsbereich gespuckt es spuckt die write-host Aufrufe dann, Design wahrscheinlich Sie zuerst Task-Methode zu deklarieren, so dass der Bereich kann die Variablen in sie übergeben und es sollte beachtet werden.

+0

Ich habe die Frage ein wenig von Ihren Follow-up-Fragen geklärt. Alle Ihre Beispiele haben die Eigenschaften in Aufgaben. Mein Problem ist, dass im Root-Scope nichts zum Debuggen eingetragen ist. –

+0

Ich werde heute Abend einen Blick auf das Problem mit dem root scope werfen, aber versuche, $ z als erstes hinzuzufügen, um zu bestätigen, dass es immer noch kaputt ist. Auch in der Zwischenzeit nur ein Vorschlag, aber warum nicht eine Aufgabe für Ihren globalen Bereich zu laufen, bevor sauber? –

+0

Versucht es und es funktioniert nicht für den Root-Bereich. Ich kann dafür sorgen, dass es über den Task-Bereich funktioniert, aber in dieser Frage geht es darum zu zeigen, warum es im Root-Bereich nicht funktioniert und warum es in der Dokumentation nichts darüber gibt. –

Verwandte Themen