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.