2010-02-05 8 views
7

Vorrei iniettare parametri della riga di comando nel mio script di build psake come:. \ build.ps1 Deploy ambiente = "sviluppo"argomenti della riga di comando di iniettare in psake

Ma psake tratterà ogni argomento come un compito e risponderà "compito non esiste"

E 'possibile iniettare argomenti della riga di comando in psake?

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

Si può avere miglior fortuna ottenere una risposta a questa domanda su http://groups.google.com/group/psake-users o http://code.google.com/p/psake/ –

+0

I 'Ho aggiunto una richiesta di funzionalità per il gruppo di discussione - http://groups.google.com/group/psake-users/browse_thread/thread/cf59508789ab58eb –

risposta

10

Il latest release of psake ora supports passing parameters a Invoke-psake, ad esempio

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

Questa funzione è stata appena aggiunta. :)

+0

Grazie per il feedback è una scelta migliore di un gobal variabile – orjan

+0

PS al momento della scrittura, questa nuova la funzione non fa parte di un 'rilascio' ufficiale: dovrai ottenere l'ultima fonte dal trunk (o qualunque altra cosa venga chiamata in GIT) –

0

Non sono esperto, ma non penso sia possibile passare argomenti a Invoke-Psake. Guardando sulla più recente fonte per Psake i params per la funzione Invoke-Psake sono:

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  
    ) 

Ci sono 4 parametri, il file di build, un elenco di attività, la versione di .NET framework, sia a documenti di uscita del tuo compiti. Sono nuovo di PowerShell e psake e sto cercando di fare la stessa cosa, sto sperimentando con il fare qualcosa di simile a questo nel mio script per ottenere la stessa cosa:

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

quindi chiamando psake con PublishForLive o PublishForStaging , di cui ho bisogno:

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

Ma non sembra funzionare per me! L'impostazione della variabile $ $ nella precondizione dell'attività sembra non avere alcun effetto. Sto ancora cercando di farlo funzionare ...

+0

Prova a fare l'assegnazione variabile $ ambiente visibile al di fuori del campo di applicazione scriptblock esempio '$ script: environment =" Live "' –

+0

È una condizione di competizione nell'esempio Pubblica verrà eseguita prima di PublishForStaging. Un'altra soluzione sarebbe quella di chiamare Publish da PublishForStaging, ma non so se è possibile o no? – orjan

+0

Questo funziona per me: compito PublishStage { $ ambiente = "stage" ExecuteTask ("Pubblica") } – orjan

1

Una variabile globale risolverà il mio problema per ora e con un solo riferimento a $ global: arg_environent sarà facile da cambiare se trovo un modo migliore per iniettare le proprietà.

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