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