¿Para cambiar de directorio dentro de un script ruby?

100

Quiero crear una nueva aplicación de rails y poner en marcha el servidor de rails para esa aplicación, todo desde un script ruby.

Mi código se ve así:

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

Sin embargo, cuando se ejecuta "rails server &", la ruta no está en la carpeta my_app, sino en la carpeta principal.

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

Todos los consejos prácticos serán apreciados.

never_had_a_name
fuente
6
Tenga en cuenta que la mejor respuesta no es la marcada. Sigue leyendo hasta el final de esta página.
Zane

Respuestas:

104

Utilizar Dir.chdir:

Dir.chdir "my_app"
Adrian
fuente
22
Tenga en cuenta que esto puede tener efectos secundarios durante el resto de su programa. Vea otras respuestas para evitar posibles errores de esto.
Leopd
Esta es una mala respuesta. Resuelve el problema, pero puede tener un problema en el código posterior. Considere cambiar la "mejor respuesta" por otra (con más votos a favor)
Ezh
366

No los escuches, Dir.chdir("dir")probablemente harás algo incorrecto. Lo que casi siempre desea es limitar el cambio a un contexto particular, sin afectar el resto del programa de esta manera:

#!/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
taw
fuente
Tenga mucho cuidado al usar un bloque en una aplicación con subprocesos, como una que usa sidekiq. Just and FYI :)
onetwopunch
@jryancanty Si hago un hilo y cambio de directorio como en esta respuesta, ¿cuáles son los "efectos secundarios", si los hay? (No Thread
usaré
1
También tengo curiosidad por saber cuáles son los efectos secundarios (por usar cualquiera de los métodos). Si cambia el directorio de trabajo, siempre puede volver a cambiarlo, ¿verdad?
stevec
No sé de ningún momento en el que no puedas ... solo hazlo original_directory = Dir::pwd, luego recuerda la variable más tarde así:Dir::chdir(original_directory)
Poyda
11

el sistema admite: argumento chdir que le permite especificar su directorio de trabajo:

system("echo Test; pwd", chdir: '/tmp')

salidas '/ tmp'

wondersz1
fuente
3

Úselo Dir.chdirpara cambiar el directorio de trabajo de un script.

mipadi
fuente
1

Utilice Dir.chdir ("[aString]")

user402987
fuente
1

¿Por qué no puedes hacerlo así?

#!/usr/bin/env ruby
system 'rails new myapp && cd myapp && rails server &'
Gaurav Manchanda
fuente
1
Cuando falla el comando del sistema, será más difícil diagnosticar qué salió mal: ¿falló la aplicación rails, falló el cd o falló el servidor de rails?
ablarg
1

Las siguientes líneas tienen el mismo resultado:

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 rieles y crear una aplicación (esto puede ser útil en pruebas de rspec, etc.):

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

y siempre puedes ejecutar un servidor rails;)

itsnikolay
fuente