2010-02-05 22 views
7

me gustaría inyectar parámetros de línea de comandos en mi psake script de construcción como:. \ build.ps1 Implementar ambiente = "desarrollo"argumentos de línea de comandos inyectar en psake

Pero psake tratará a todos los argumentos como una tarea y responderá "la tarea no existe"

¿Es posible inyectar argumentos de línea de comando en psake?

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

Puede que tenga mejor suerte para obtener una respuesta a esta pregunta en http://groups.google.com/group/psake-users o en http://code.google.com/p/psake/ –

+0

I Agregué una solicitud de función al grupo de discusión: http://groups.google.com/group/psake-users/browse_thread/thread/cf59508789ab58eb –

Respuesta

10

El latest release of psake ahora supports passing parameters a Invoke-psake, por ejemplo

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

Esta característica acaba de ser agregada. :)

+0

Gracias por la retroalimentación que es una mejor opción que un gobal variables – orjan

+0

PS en el momento de la escritura, esta nueva la característica no es parte de una 'versión' oficial: tendrá que obtener la última fuente del tronco (o lo que sea que se llame a un tronco en GIT) –

0

No soy un experto, pero no creo que sea posible pasar argumentos a Invoke-Psake. Buscando en la última fuente para Psake los parametros para la función Invoke-Psake son:

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  
    ) 

Hay 4 parámetros, el archivo de creación, una lista de tareas, la versión del marco .NET, ya sea a documentos de salida de su Tareas. Soy nuevo en PowerShell y psake y yo estoy tratando de hacer lo mismo, estoy experimentando con hacer algo como esto en mi script para conseguir lo mismo:

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

psake Entonces llamando con PublishForLive o PublishForStaging , lo que sea que necesite:

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

¡Pero parece que no funciona para mí! Establecer la variable de entorno $ en la condición previa de la tarea parece no tener ningún efecto. Intentando hacer que esto funcione ...

+0

Intente hacer que la asignación de variable de entorno $ sea visible fuera del alcance de scriptblock, por ejemplo '$ script: environment =" Live "' –

+0

Es una condición de carrera en su ejemplo Publish se ejecutará antes de PublishForStaging. Otra solución sería llamar a Publish desde PublishForStaging, pero no sé si es posible o no. – orjan

+0

Esto funciona para mí: PublishStage tarea { entorno $ = "etapa" ExecuteTask ("Publicar") } – orjan

1

Una variable global resolverá mi problema por ahora y con solo una referencia a $ global: arg_environent será fácil de cambiar si encuentro una mejor manera de inyectar las propiedades.

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