2010-02-05 13 views
7

Chciałbym wprowadzić parametry wiersza polecenia do mojego psake kompilacji skryptu jak:. \ build.ps1 Deploy środowiska = „rozwoju”argumenty wiersza poleceń wstrzyknąć do psake

Ale psake potraktuje każdy argument jako zadanie i odpowie "zadanie nie istnieje"

Czy można wprowadzić argumenty wiersza poleceń w psake?

build.ps1 --> 
Import-Module '.\psake.psm1' 
Invoke-psake '.\tasks.ps1' $args 
Remove-Module psake 
+1

Możesz uzyskać więcej odpowiedzi na to pytanie na http://groups.google.com/group/psake-users lub na http://code.google.com/p/psake/ –

+0

I "Dodano zadanie dotyczące funkcji do grupy dyskusyjnej - http://groups.google.com/group/psake-users/browse_thread/thread/cf59508789ab58eb –

Odpowiedz

10

latest release of psake teraz supports passing parameters na wywołanie-psake np

Invoke-psake .\parameters.ps1 -parameters @{"p1"="v1";"p2"="v2"} 

Ta funkcja właśnie została dodana. :)

+0

Dzięki za opinię, że jest to lepsza opcja niż Gobal zmienna – orjan

+0

PS w czasie pisania, ta nowa funkcja nie jest częścią oficjalnego "wydania": będziesz musiał pobrać najnowsze źródło z bagażnika (lub cokolwiek innego, jak nazywa się trunk w GIT) –

0

Nie jestem ekspertem, ale nie sądzę, że możliwe jest przekazanie argumentów do Invoke-Psake. Patrząc na najnowsze źródła Psake params dla funkcji Invoke-Psake są:

param(
    [Parameter(Position=0,Mandatory=0)] 
    [string]$buildFile = 'default.ps1', 
    [Parameter(Position=1,Mandatory=0)] 
    [string[]]$taskList = @(), 
    [Parameter(Position=2,Mandatory=0)] 
    [string]$framework = '3.5', 
    [Parameter(Position=3,Mandatory=0)] 
    [switch]$docs = $false  
    ) 

Istnieją 4 parametry, plik build, lista zadań, wersja .NET framework, czy dokumentacja wyjściowego przetwornika zadania. Jestem nowy w powershell i psake i staram się robić to samo, jestem eksperymentować z robieniem czegoś takiego w moim skrypcie, aby osiągnąć to samo:

properties { 
    $environment = "default" 
} 

task PublishForLive -precondition { $environment = "Live"; return $true; } -depends Publish { 

} 

task PublishForStaging -precondition { $environment = "Staging"; return $true; } -depends Publish { 

} 

task Publish { 
    Write-Host "Building and publishing for $environment environment" 
    #Publish the project... 
} 

następnie wywołanie psake z PublishForLive lub PublishForStaging , w zależności od tego, czego potrzebuję:

powershell -NoExit -ExecutionPolicy Unrestricted -Command "& {Import-Module .\tools\psake\psake.psm1; Invoke-psake .\psake-common.ps1 PublishForLive }" 

Ale to nie działa dla mnie! Ustawienie zmiennej $ environment w warunku zadaniowym wydaje się nie mieć żadnego efektu. Nadal próbuję zrobić to ...

+0

Spróbuj ustawić przypisanie zmiennej środowiskowej widocznej poza zasięgiem skryptu, np. '$ script: environment =" Live "' –

+0

Jest to stan wyścigu w twoim przykładzie Opublikuj zostanie uruchomiony przed opcją PublishForStaging. Innym rozwiązaniem byłoby wywołanie Opublikuj z PublishForStaging, ale nie wiesz, czy jest to możliwe, czy nie? – orjan

+0

Działa to dla mnie: zadanie PublishStage { $ środowiskową = „etap” ExecuteTask („Publikuj”) } – orjan

1

Globalna zmienna rozwiąże mój problem na teraz i tylko z jednym odniesieniem do $ global: arg_environent będzie łatwa do zmiany, jeśli znajdę lepszy sposób na wstrzyknięcie właściwości.

build.ps1

param(
    [Parameter(Position=0,Mandatory=0)] 
    [string]$task, 
    [Parameter(Position=1,Mandatory=0)] 
    [string]$environment = 'dev' 
) 

clear 
$global:arg_environent = $environment 
Import-Module .\psake.psm1 
Invoke-psake tasks.ps1 $task 
Remove-Module psake 

tasks.ps1

properties { 
    $environment = $global:arg_environent 
} 

task default -depends Deploy 

task Deploy { 
    echo "Copy stuff to $environment" 
}