2016-02-09 12 views
6

Utilizzando psake 4.5.0 ho cercato di passare le mie default.ps1 di file molti modi diversi, passando sia -properties e -parameters, ma questi valori sono semplicemente ignorato nella root-scope del .ps1 -script.Psake ignora proprietà ei parametri

Eseguire relativa (con psake in una sottocartella):

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

Eseguire con modulo importato:

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

Eseguire attraverso installata Chocolatey pacchetto:

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

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

In questo momento, il default.ps1 è semplicemente il debug tutti questi valori:

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

L'uscita è in tutti i casi:

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

Qual è la sintassi corretta per passare properties e/o parameters a psake?

+0

fa questo aiuto a tutti? https://github.com/psake/psake/tree/master/examples/passingParametersString –

+0

@ almog.ori Non proprio, è un esempio molto teorico, mentre il mio è molto concreto. –

risposta

0

Non ho esaminato troppo a lungo ma sembra che tu dichiari la variabile $ nelle proprietà {... qui ...} o in Param (... qui ...) così psake può li popolano, vengono però bene. Ti sei perso $ z. A meno che non manchi qualcosa di fondamentale sul perché utilizzare insieme parametri e proprietà?

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

codice invoke campione (psake installato tramite chocolatey per 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"} 

EDIT:

Questa è la funzione Properties linea 256 in psake .psm1, si noti che accetta un argomento scriptblock e lo aggiunge all'array delle proprietà sullo stack di contesto trovato su $ psake, ancora sc blocchi Ript qui

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

Linea 372 di Invoke-psake funzione nel psake.psm1 carica il copione default.ps1 costruire il campo di applicazione (a questo punto vedi i tuoi write-host chiamate ma nessuna variabile caricati)

. $psake.build_script_file.FullName 

Linea 394 e Linea 397 Carica i blocchi di script da parametri e proprietà all'ambito.

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

linea 420 e 423 chiamate invoke-Task (linea 198) che a sua volta utilizza le variabili sopra definite, inoltre v'è un'asserzione che le variabili non sono nulli in questa funzione .

Non penso che il caso di utilizzo previsto implicasse il caricamento di queste variabili in ambito radice, quando lo script è il primo. originariamente nella portata sputa le chiamate write-host, probabilmente il progetto intendeva dichiarare prima il metodo Task in modo che l'ambito possa passare le variabili al suo interno e dovrebbe essere notato.

+0

Ho chiarito la domanda un po 'dalle vostre domande di follow-up. Tutti i tuoi esempi hanno le proprietà dentro Attività. Il mio problema è che nulla viene popolato nello scope-scope per il debug. –

+0

Stasera darò un'occhiata al problema relativo all'ambito della root, ma provate ad aggiungere $ z prima di confermare ancora rotto. Inoltre, nel frattempo, solo un suggerimento, ma perché non eseguire un compito per il tuo ambito globale da eseguire prima della pulizia? –

+0

Provato e non funziona per lo scopo di root. Posso farlo funzionare attraverso 'Task'-scope, ma questa domanda riguarda l'evidenziazione del motivo per cui non funziona nello scope-scope e perché non c'è nulla nella documentazione a riguardo. –

Problemi correlati