2010-07-27 40 views
79

Tôi muốn tạo ứng dụng đường ray mới và kích hoạt máy chủ đường ray cho ứng dụng đó, mọi thứ từ tập lệnh ruby.Để thay đổi thư mục bên trong tập lệnh ruby?

đang nhìn tôi như thế này:

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

Tuy nhiên, khi chạy "đường ray máy chủ &" con đường không có trong thư mục my_app, nhưng trong thư mục mẹ.

Có cách nào thay đổi thư mục bên trong tập lệnh để tôi có thể chạy "máy chủ đường ray", "cào" và "rake db: di chuyển" cho ứng dụng mới đó không?

Tất cả các mẹo xung quanh công việc sẽ được đánh giá cao.

+5

Lưu ý rằng câu trả lời hay nhất không phải là đánh dấu. Tiếp tục đọc ở cuối trang này. – Zane

Trả lời

81

Sử dụng Dir.chdir:

Dir.chdir "my_app" 
+16

Hãy nhớ rằng điều này có thể có tác dụng phụ trong suốt phần còn lại của chương trình của bạn. Xem các câu trả lời khác để tránh các lỗi tiềm ẩn từ điều này. – Leopd

3

Sử dụng Dir.chdir để thay đổi thư mục làm việc cho một kịch bản.

318

Đừng nghe họ, Dir.chdir("dir") lẽ sẽ làm điều sai trái. Những gì bạn hầu như luôn luôn muốn là để hạn chế sự thay đổi đến một bối cảnh đặc biệt, mà không ảnh hưởng phần còn lại của chương trình như thế này:

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

Tôi thực sự muốn câu trả lời này được chấp nhận. :) –

+5

Vui vì tôi đã đọc! Câu trả lời này chính xác hơn và phải được chấp nhận. –

+0

Hãy rất cẩn thận khi sử dụng một khối trong ứng dụng có luồng như ứng dụng sử dụng sidekiq. Chỉ cần và FYI :) – onetwopunch

1

Tại sao có thể không chỉ làm điều đó như thế này:

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

Khi lệnh hệ thống bị lỗi, sẽ khó chẩn đoán những gì đã xảy ra - ứng dụng đường ray có bị lỗi hay không, máy chủ bị lỗi hay máy chủ bị lỗi? – ablarg

0

Sau đây dòng có cùng một kết quả:

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 

cũng bạn có thể chạy đường ray và tạo ra một ứng dụng (điều này có thể hữu ích trong các thử nghiệm rspec và vv):

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

và bao giờ bạn có thể chạy máy chủ đường ray;)

Các vấn đề liên quan