2010-07-27 11 views
79

Quiero crear una nueva aplicación de rieles y activar el servidor de rieles para esa aplicación, todo desde un script de ruby.¿Para cambiar el directorio dentro de un script de ruby?

Mi mirada código como este:

#!/usr/bin/env ruby 
system "rails new my_app" 
system "cd my_app" 
system "rails server &" 

Sin embargo, cuando se ejecuta "raíles del servidor &" el camino no está en la carpeta my_app, pero en la carpeta principal.

¿Hay alguna manera de cambiar el directorio dentro de un script para que pueda ejecutar "rails server", "rake about" y "rake db: migrate" para esa nueva aplicación?

Se agradecerán todos los consejos prácticos.

+5

Tenga en cuenta que la mejor respuesta no es el marcado. Sigue leyendo al pie de esta página. – Zane

Respuesta

81

Uso Dir.chdir:

Dir.chdir "my_app" 
+16

Tenga en cuenta que esto puede tener efectos secundarios en el resto de su programa. Vea otras respuestas para evitar posibles errores de esto. – Leopd

3

Uso Dir.chdir para cambiar el directorio de trabajo para un guión.

318

no hagas caso a ellos, Dir.chdir("dir") probablemente va a hacer las cosas mal. Lo que casi siempre se quiere es limitar el cambio a un contexto particular, sin afectar al resto del programa como este:

#!/usr/bin/env ruby 
system "rails new my_app" 
Dir.chdir("my_app") do 
    system "rails server &" 
end 
# back where we were, even with exception or whatever 
+21

Realmente quiero que se acepte esta respuesta. :) –

+5

Me alegro de seguir leyendo! Esta respuesta es más correcta y debe ser aceptada. –

+0

Tenga mucho cuidado al usar un bloque en una aplicación con hebras como la que usa sidekiq. Justo y FYI :) – onetwopunch

1

Por qué no puedes simplemente hacerlo de esta manera:

#!/usr/bin/env ruby 
system 'rails new myapp && cd myapp && rails server &' 
+1

Cuando falla el comando del sistema, será más difícil diagnosticar lo que salió mal: ¿falló la aplicación Rails, falló el cd o falló el servidor Rails? – ablarg

0

La siguiente líneas tienen la misma salida:

puts Dir.chdir("/tmp") { IO.popen("ls -la") { |io| io.read } } 

puts IO.popen(["ls", "-la", "/tmp"]).read 

puts IO.popen("ls -la /tmp").read 

# drwxrwxrwt 25 root  root  16384 июля 23 01:17 . 
# drwxr-xr-x 22 root  root  4096 июля 22 13:36 .. 
# drwxrwxr-x 12 itsnikolay itsnikolay 4096 июля 19 17:14 app_template 
# drwx------ 2 itsnikolay itsnikolay 4096 июля 21 15:04 .com.google.Chrome.dThb8f 
# drwx------ 2 itsnikolay itsnikolay 4096 июля 18 20:55 .com.google.Chrome.FGDBGc 

también puede ejecutar carriles y crear una aplicación (esto puede ser útil en las pruebas y rspec etc.):

IO.popen("cd /tmp/ && rails new test_app").read 

y nunca se puede ejecutar un servidor de rieles;)

Cuestiones relacionadas