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.