2016-02-09 102 views
6

parametreleri, ancak bu değerler sadece .ps1 kök kapsam içinde göz ardı edilir -senaryo.Psake özelliklerini sayar ve hem <code>-properties</code> ve <code>-parameters</code> geçen, benim <code>default.ps1</code> dosya birçok farklı şekilde çalıştırmayı denedim 4.5.0</strong><strong>psake kullanma

( bir alt psake ile ) göreli yürütün:

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

alınan modül ile yürütün:

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

yüklü chocolatey paketinin boyunca yürütün:

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

yürütün:

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

Şu anda default.ps1 basitçe sadece tüm bu değerleri ayıklama edilir:

çıkışı her durumda olduğunu
// 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 ve/veya parameters'u geçmek için uygun sözdizimi nedir?

+0

bu hiç yardımcı olmaz mı? https://github.com/psake/psake/tree/master/examples/passingParametersString –

+0

@ almog.ori Aslında, benimki çok somut iken, bu çok teorik bir örnek. –

cevap

0

Çok uzun süredir bakmadım ama özelliklerdeki $ değişkeni bildirdiğiniz sürece {... burada ...} veya Param'de (... burada ...) göründüğü sürece psake olabilir Onları doldurun, yine de gelirler. $ Z'i kaçırdın. Neden parametre ve özelliklerin birlikte kullanıldığına dair temel bir şey eksik olmadıkça?

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

çağırmak kod örneği (psake C :) chocolatey ile yüklenmiş

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

DÜZENLEME:

Bu psake içinde Properties fonksiyon Hat 256 .psm1, bir scriptblock args alır ve $ psake, hala sc bulunan bağlam yığındaki özellikler dizisine ekler Burada

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

Hat 372 psake.psm1 içinde Invoke-psake fonksiyonun ript blokları (eğer write-host aramaları bakın bu noktada ancak hiçbir değişkenler yüklü) kapsamına için default.ps1 yapınızın kodlarını yükler

. $psake.build_script_file.FullName 

Hattı 394 ve Satır 397 Komut bloklarını parametrelerden ve özelliklerden kapsam alanına yükler.

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

Hat 420 ve 423 çağrı invoke-Task sırayla yukarıda tanımlanan değişkenleri kullanır (198 Hat), aynı zamanda değişkenler bu işlev null olmayan bir assert vardır .

Beklenen kullanım durumunun, bu değişkenler komut dosyası ilk olduğunda kök kapsamına yüklenmesini içermediğini sanmıyorum. o zaman kapsam içine kaynak write-host çağrıları tükürür sonra, tasarım büyük olasılıkla Task yöntemi ilan etmeyi amaçladı böylece kapsamı içine değişkenleri geçirebilir ve not edilmelidir.

+0

Sorunu takip sorularınızdan biraz ayırdım. Tüm örnekleriniz Görevler içindeki özelliklere sahiptir. Benim sorunum, hata ayıklama için kök kapsamda hiçbir şeyin doldurulmamasıdır. –

+0

Kök kapsam sorunu hakkında bu gece bir göz atacağım ama hala onaylamak için $ z eklemeyi deneyin. Ayrıca bu arada sadece bir öneri var ama neden küresel kapsamınızın temizliğe gitmesi için bir görev yapmıyorsunuz? –

+0

Bunu denedim ve kök kapsamı için işe yaramıyor. “Görev” kapsamında çalışabilirim, ancak bu soru, neden bunun nedeninin kök kapsamda çalışmadığının ve bununla ilgili belgelerin neden hiçbir şeyin bulunmadığını vurgulamaktır. –