2011-03-25 14 views
31

Quiero ejecutar una tarea de Rake que solicite la entrada del usuario.¿Es posible realizar una tarea de Rake interactiva?

Sé que puedo suministrar de entrada en la línea de comandos, pero quiero preguntar al usuario si son Seguro quieren proceder con una acción particular en caso de que escrito mal uno de los valores suministrados a la tarea Rake .

+6

Busque en lugar de tareas interactivas [Thor] (https://github.com/wycats/thor). Es muy superior a Rake, y viene con Rails, por lo que ya lo tienes sin instalar nada. – meagar

+0

@meagar acaba de toparse con esto hoy y estoy atascado, ¿alguna vez te diste cuenta? Estoy en una Mac con zsh. . . –

+0

Acabo de descifrarlo, aparentemente estaba relacionado con el complemento Rails zsh. Cuando eliminé ese complemento, reinicié zsh y luego lo re-agregué, el problema desapareció. . . –

Respuesta

69

Algo como esto podría funcionar

task :action do 
    STDOUT.puts "I'm acting!" 
end 

task :check do 
    STDOUT.puts "Are you sure? (y/n)" 
    input = STDIN.gets.strip 
    if input == 'y' 
    Rake::Task["action"].reenable 
    Rake::Task["action"].invoke 
    else 
    STDOUT.puts "So sorry for the confusion" 
    end 
end 

REACTIVACIÓN de tareas y la invocación de How to run Rake tasks from within Rake tasks?

+0

¿Alguna idea de cuándo este código mostraría "^ M" cuando se pulsa la tecla Entrar después de escribir "no"? –

5

Una característica muy útil para la entrada del usuario es ponerlo en un bucle do..while, sólo a seguir cuando un usuario ha suministrado válida entrada. Ruby no tiene explícitamente esta construcción, pero puede lograr lo mismo con begin y until. Eso se sumaría a la respuesta aceptada de la siguiente manera:

task :action do 
    STDOUT.puts "I'm acting!" 
end 

task :check do 
    # Loop until the user supplies a valid option 
    begin 
    STDOUT.puts "Are you sure? (y/n)" 
    input = STDIN.gets.strip.downcase 
    end until %w(y n).include?(input) 

    if input == 'y' 
    Rake::Task["action"].reenable 
    Rake::Task["action"].invoke 
    else 
    # We know at this point that they've explicitly said no, 
    # rather than fumble the keyboard 
    STDOUT.puts "So sorry for the confusion" 
    end 
end 
1

Aquí hay un ejemplo sin usar otra tarea.

task :solve_earth_problems => :environment do  
    STDOUT.puts "This is risky. Are you sure? (y/n)" 

    begin 
    input = STDIN.gets.strip.downcase 
    end until %w(y n).include?(input) 

    if input != 'y' 
    STDOUT.puts "So sorry for the confusion" 
    return 
    end 

    # user accepted, carry on 
    Humanity.wipe_out! 
end 
Cuestiones relacionadas