Per cambiare directory all'interno di uno script Ruby?


100

Voglio creare una nuova applicazione rails e avviare il server rails per quell'applicazione, tutto da uno script ruby.

Il mio codice assomiglia a questo:

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

Tuttavia, quando si esegue "rails server &", il percorso non è nella cartella my_app, ma nella cartella principale.

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

Sarebbe apprezzato tutto il lavoro intorno ai suggerimenti.


6
Nota che la risposta migliore non è quella contrassegnata. Continua a leggere fino alla fine di questa pagina.
Zane

Risposte:


104

Usa Dir.chdir:

Dir.chdir "my_app"

22
Tieni presente che questo può avere effetti collaterali durante il resto del programma. Vedi altre risposte per evitare potenziali bug da questo.
Leopd

Questa è una cattiva risposta. Risolve il problema, ma puoi avere un problema nel codice dopo di esso. Si prega di considerare di cambiare la "risposta migliore" con un'altra (con più voti positivi)
Ezh

366

Non ascoltarli, Dir.chdir("dir")probabilmente farà la cosa sbagliata. Quello che vuoi quasi sempre è limitare il cambiamento a un contesto particolare, senza influire sul resto del programma in questo modo:

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

Fai molta attenzione quando usi un blocco in un'applicazione con thread come quella che usa sidekiq. Solo e FYI :)
pranzo il

@jryancanty Se creo un thread e cambio directory come in questa risposta, quali sono gli "effetti collaterali", se ce ne sono? (Non userò sidekick, solo Threadclasse)
onebree

1
Sono anche curioso di sapere quali sono gli effetti collaterali (derivanti dall'uso di entrambi i metodi). Se cambi la directory di lavoro, puoi sempre cambiarla di nuovo, giusto?
stevec

Non so di momenti in cui non puoi ... fallo original_directory = Dir::pwde poi richiama la variabile più tardi in questo modo:Dir::chdir(original_directory)
Poyda

11

il sistema supporta: argomento chdir che consente di specificare la sua directory di lavoro:

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

uscite '/ tmp'




1

Perché non puoi farlo 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 rails ha avuto esito negativo, il cd non è riuscito o il server rails non è riuscito?
ablarg

1

Le seguenti righe hanno lo stesso output:

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 puoi eseguire rails e creare un'applicazione (questo può essere utile nei test rspec e così via):

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

e mai puoi eseguire un server rails;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.