Ruby betiği içindeki dizini değiştirmek için?


101

Yeni bir rails uygulaması oluşturmak ve bu uygulama için rails sunucusunu çalıştırmak istiyorum, her şeyi bir ruby ​​betiğinden.

Kodum şöyle görünüyor:

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

Ancak, "rails server &" çalıştırıldığında, yol my_app klasöründe değil, ana klasördedir.

Bu yeni uygulama için "rails server", "rake about" ve "rake db: migrate" çalıştırabilmem için komut dosyası içindeki dizini değiştirmenin bir yolu var mı?

İpuçları etrafında yapılan tüm çalışmalar takdir edilecektir.


6
En iyi cevabın işaretli cevap olmadığını unutmayın. Bu sayfanın sonuna kadar okumaya devam edin.
Zane

Yanıtlar:


105

Kullanım Dir.chdir:

Dir.chdir "my_app"

22
Bunun programınızın geri kalanında yan etkileri olabileceğini unutmayın. Bundan kaynaklanan olası hataları önlemek için diğer yanıtlara bakın.
Leopd

Bu kötü bir cevap. Sorunu çözer, ancak ondan sonra kodda sorun yaşayabilirsiniz. Lütfen "en iyi yanıtı" başka bir yanıtla değiştirmeyi düşünün (daha fazla olumlu oyla)
Ezh

367

Onları dinleme, Dir.chdir("dir")muhtemelen yanlış bir şey yapacaktır. Neredeyse her zaman istediğiniz şey, programın geri kalanını şu şekilde etkilemeden değişikliği belirli bir bağlamla sınırlandırmaktır:

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

Sidekiq kullanan bir zincir uygulamasında blok kullanırken çok dikkatli olun. Just and FYI :)
onetwopunch

@jryancanty Bu cevapta olduğu gibi bir konu açarsam ve dizini değiştirirsem, varsa "yan etkileri" nelerdir? (Sidekick kullanmayacağım, sadece Threadsınıf)
onebree

1
Yan etkilerin ne olduğunu da merak ediyorum (her iki yöntemi kullanarak). Çalışma dizinini değiştirirseniz, her zaman geri değiştirebilirsiniz, değil mi?
stevec

original_directory = Dir::pwdDir::chdir(original_directory)
Yapamayacağınız

11

system destekleri: çalışma dizinini belirtmenize izin veren chdir argümanı:

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

çıktılar '/ tmp'




1

Neden bunu böyle yapamıyorsun:

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

1
Sistem komutu başarısız olduğunda, neyin yanlış gittiğini teşhis etmek daha zor olacaktır - raylar uygulaması başarısız oldu mu, cd başarısız mı yoksa raylar sunucusu mu başarısız oldu?
ablarg

1

Aşağıdaki satırlar aynı çıktıya sahiptir:

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

ayrıca rayları çalıştırabilir ve bir uygulama oluşturabilirsiniz (bu, rspec testlerinde vb. yardımcı olabilir):

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

ve bir rails sunucusu çalıştırabilirsiniz;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.