2010-07-27 13 views
79

Voglio creare una nuova applicazione di rails e avviare il server di rails per quella applicazione, tutto da uno script ruby.Per cambiare directory all'interno di uno script ruby?

mio aspetto codice come questo:

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

Tuttavia, durante l'esecuzione di "guide del server &" il percorso non si trova nella cartella my_app, ma nella cartella principale.

C'è un modo per cambiare la directory all'interno di uno script in modo da poter eseguire "rails server", "rake about" e "rake db: migrate" per quella nuova applicazione?

Sarebbero apprezzati tutti i suggerimenti sui lavori.

+5

Nota che la risposta migliore non è la marcata uno. Continua a leggere in fondo a questa pagina. – Zane

risposta

81

Uso Dir.chdir:

Dir.chdir "my_app" 
+16

Ricorda che questo può avere effetti collaterali nel resto del tuo programma. Vedi altre risposte per evitare potenziali bug da questo. – Leopd

3

Usa Dir.chdir per cambiare la directory di lavoro per uno script.

318

Non ascoltare a loro, Dir.chdir("dir") probabilmente farà la cosa sbagliata. Quello che quasi sempre desidera è quello di limitare il cambiamento ad un particolare contesto, senza influire resto del programma come questo:

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

Voglio davvero che questa risposta sia accettata. :) –

+5

Contento, ho continuato a leggere! Questa risposta è più corretta e dovrebbe essere accettata. –

+0

State molto attenti a usare un blocco in un'applicazione filettata come quella che usa sidekiq. Just and FYI :) – onetwopunch

1

Perché non puoi semplicemente fare in questo modo:

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

Quando il comando di sistema fallisce, sarà più difficile diagnosticare cosa è andato storto: l'app per rails ha avuto esito negativo, il cd ha avuto esito negativo o il server rails ha avuto esito negativo? – ablarg

0

Il seguente linee hanno la stessa uscita:

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 

inoltre è possibile eseguire le rotaie e creare un'applicazione (questo può essere utile nei test RSpec e così via):

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

e sempre è possibile eseguire un server di rotaie;)

Problemi correlati