So ändern Sie das Verzeichnis in einem Ruby-Skript?


100

Ich möchte eine neue Rails-Anwendung erstellen und den Rails-Server für diese Anwendung starten, alles aus einem Ruby-Skript.

Mein Code sieht folgendermaßen aus:

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

Wenn Sie jedoch "Rails Server &" ausführen, befindet sich der Pfad nicht im Ordner my_app, sondern im übergeordneten Ordner.

Gibt es eine Möglichkeit, das Verzeichnis innerhalb eines Skripts zu ändern, damit ich "Rails Server", "Rake About" und "Rake DB: Migrate" für diese neue Anwendung ausführen kann?

Alle Workaround-Tipps wären willkommen.


6
Beachten Sie, dass die beste Antwort nicht die markierte ist. Lesen Sie weiter unten auf dieser Seite.
Zane

Antworten:


104

Verwendung Dir.chdir:

Dir.chdir "my_app"

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

Das ist eine schlechte Antwort. Es löst das Problem, aber Sie können ein Problem im Code danach haben. Bitte erwägen Sie, "beste Antwort" in eine andere zu ändern (mit mehr Gegenstimmen)
Ezh

366

Hören Sie nicht auf sie, Dir.chdir("dir")wird wahrscheinlich das Falsche tun. Was Sie fast immer wollen, ist, Änderungen auf einen bestimmten Kontext zu beschränken, ohne den Rest des Programms wie folgt zu beeinflussen:

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

Seien Sie sehr vorsichtig, wenn Sie einen Block in einer Thread-Anwendung verwenden, z. B. einer, die Sidekiq verwendet. Just and FYI :)
Onetwopunch

@jryancanty Wenn ich einen Thread erstelle und das Verzeichnis wie in dieser Antwort ändere, was sind die "Nebenwirkungen", wenn überhaupt? (Ich werde keinen Kumpel benutzen, nur ThreadKlasse)
Onebree

1
Ich bin auch neugierig, was die Nebenwirkungen sind (von beiden Methoden). Wenn Sie das Arbeitsverzeichnis ändern, können Sie es jederzeit wieder ändern, oder?
Stevec

Sie wissen nicht, wann Sie es nicht können ... tun Sie es einfach original_directory = Dir::pwdund rufen Sie die Variable später wie Dir::chdir(original_directory)
folgt auf

11

Das System unterstützt das Argument: chdir, mit dem Sie das Arbeitsverzeichnis angeben können:

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

gibt '/ tmp' aus




1

Warum kannst du es nicht einfach so machen:

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

1
Wenn der Systembefehl fehlschlägt, ist es schwieriger zu diagnostizieren, was schief gelaufen ist - ist die Rails-App fehlgeschlagen, ist die CD ausgefallen oder ist der Rails-Server ausgefallen?
ablarg

1

Die folgenden Zeilen haben die gleiche Ausgabe:

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 Rails ausführen und eine Anwendung erstellen (dies kann bei Rspec-Tests usw. hilfreich sein):

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

und immer kannst du einen Rails Server betreiben;)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.