Untuk mengubah direktori di dalam skrip ruby?


100

Saya ingin membuat aplikasi rel baru dan menjalankan server rel untuk aplikasi itu, semuanya dari skrip ruby.

Kode saya terlihat seperti ini:

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

Namun, saat menjalankan "rails server &" jalurnya tidak ada di folder my_app, tetapi di folder induk.

Apakah ada cara untuk mengubah direktori di dalam skrip sehingga saya dapat menjalankan "rails server", "rake about" dan "rake db: migrate" untuk aplikasi baru tersebut?

Semua tips untuk mengatasi masalah akan dihargai.


6
Perhatikan bahwa jawaban terbaik bukanlah yang ditandai. Teruslah membaca hingga bagian bawah halaman ini.
Zane

Jawaban:


104

Penggunaan Dir.chdir:

Dir.chdir "my_app"

22
Ingatlah bahwa ini dapat memiliki efek samping sepanjang program Anda. Lihat jawaban lain untuk menghindari kemungkinan bug dari ini.
Leopd

Ini jawaban yang buruk. Ini menyelesaikan masalah, tetapi Anda dapat mengalami masalah dalam kode setelahnya. Harap pertimbangkan untuk mengubah "jawaban terbaik" ke yang lain (dengan lebih banyak
suara positif

366

Jangan dengarkan mereka, Dir.chdir("dir")mungkin akan melakukan hal yang salah. Apa yang hampir selalu Anda inginkan adalah membatasi perubahan pada konteks tertentu, tanpa memengaruhi program lainnya seperti ini:

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

Berhati-hatilah saat menggunakan blok dalam aplikasi berulir seperti aplikasi yang menggunakan sidekiq. Just and FYI :)
onetwopunch

@jryancanty Jika saya membuat utas, dan mengubah direktori seperti dalam jawaban ini, apa "efek samping", jika ada? (Saya tidak akan menggunakan sahabat karib, hanya Threadkelas)
bulan

1
Saya juga ingin tahu apa efek sampingnya (dari menggunakan metode mana pun). Jika Anda mengubah direktori kerja, Anda selalu dapat mengubahnya kembali, bukan?
stevec

Tidak tahu kapan Anda tidak bisa ... lakukan saja original_directory = Dir::pwd, lalu ingat variabelnya nanti seperti:Dir::chdir(original_directory)
Poyda

11

dukungan sistem: argumen chdir yang memungkinkan Anda menentukan direktori kerjanya:

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

keluaran '/ tmp'




1

Mengapa Anda tidak bisa melakukannya seperti ini:

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

1
Ketika perintah sistem gagal, akan lebih sulit untuk mendiagnosis apa yang salah - apakah aplikasi rails gagal, apakah cd gagal, atau apakah server rails gagal?
ablarg

1

Baris berikut memiliki keluaran yang sama:

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

Anda juga dapat menjalankan rails dan membuat aplikasi (ini dapat membantu dalam tes rspec dan lain-lain):

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

dan pernah Anda dapat menjalankan server rel;)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.