2010-07-27 2 views
79

Ich möchte eine neue Rails-Anwendung erstellen und den Rails-Server für diese Anwendung starten, alles aus einem Ruby-Skript.Um das Verzeichnis in einem Ruby-Skript zu ändern?

Mein Code sieht wie folgt aus:

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

jedoch beim Laufen "Schienen-Server &" der Weg ist nicht im my_app Ordner, sondern in den übergeordneten Ordner.

Gibt es eine Möglichkeit, Verzeichnis innerhalb eines Skripts zu ändern, so dass ich "Rails Server", "Rake über" und "Rake Db: Migrieren" für diese neue Anwendung ausführen kann?

Alle Arbeiten um Tipps würden geschätzt werden.

+5

Beachten Sie, dass die beste Antwort ist nicht die markiert ein. Lesen Sie weiter unten auf dieser Seite. – Zane

Antwort

81

Verwendung Dir.chdir:

Dir.chdir "my_app" 
+16

Denken Sie daran, dass dies im Rest Ihres Programms zu Nebenwirkungen führen kann. Sehen Sie sich andere Antworten an, um mögliche Fehler zu vermeiden. – Leopd

3

Verwenden Dir.chdir das Arbeitsverzeichnis für ein Skript zu ändern.

318

Sie nicht auf sie hören, Dir.chdir("dir") wird die falsche Sache wahrscheinlich tun. Was Sie fast immer wollen Änderung auf einen bestimmten Kontext zu begrenzen, ohne das Programm wie folgt zu beeinflussen Rest:

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

Ich möchte wirklich, dass diese Antwort akzeptiert wird. :) –

+5

Froh, ich las weiter! Diese Antwort ist korrekter und sollte akzeptiert werden. –

+0

Seien Sie sehr vorsichtig bei der Verwendung eines Blocks in einer Anwendung mit Threads, die Sidekiq verwendet. Just and FYI :) – onetwopunch

1

Warum können Sie nicht tun es einfach so:

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

Wenn der Systembefehl fehlschlägt, wird es schwieriger zu diagnostizieren, was schiefgelaufen ist - ist die Rails App ausgefallen, ist die CD ausgefallen oder ist der Rails Server ausgefallen? – ablarg

0

Die folgende Linien haben die gleiche Leistung:

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 

Sie können auch Schienen laufen und eine Anwendung zu erstellen (dies kann in rspec Tests usw. hilfreich sein):

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

und immer können Sie einen Schienen-Server laufen;)

Verwandte Themen