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


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"

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

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'




1

¿Por qué no puedes hacerlo así?

#!/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 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;)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.