Để thay đổi thư mục bên trong tập lệnh ruby?


100

Tôi muốn tạo một ứng dụng rails mới và kích hoạt máy chủ rails cho ứng dụng đó, mọi thứ từ tập lệnh ruby.

Mã của tôi trông 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 "máy chủ rails &", đường dẫn không nằm trong thư mục my_app mà nằm 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ủ rails", "rake about" và "rake db: migrate" cho ứng dụng mới đó không?

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


6
Lưu ý rằng câu trả lời tốt nhất không phải là câu được đánh dấu. Hãy đọc đến cuối trang này.
Zane

Câu trả lời:


104

Sử dụng Dir.chdir:

Dir.chdir "my_app"

22
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 lỗi tiềm ẩn từ điều này.
Leopd

Đây là một câu trả lời tồi. Nó giải quyết được vấn đề, nhưng bạn có thể gặp sự cố trong mã sau nó. Vui lòng xem xét thay đổi "câu trả lời hay nhất" thành một câu trả lời khác (với nhiều lượt ủng hộ hơn)
ủng hộ

366

Đừng nghe họ, Dir.chdir("dir")có thể sẽ làm điều sai trái. Những gì bạn hầu như luôn muốn là giới hạn thay đổi trong một ngữ cảnh cụ thể, mà không ảnh hưởng đến 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

Hãy hết sức cẩn thận khi sử dụng một khối trong một ứng dụng luồng chẳng hạn như một khối sử dụng sidekiq. Just and FYI :)
onetwopunch vào

@jryancanty Nếu tôi tạo một chủ đề và thay đổi thư mục như trong câu trả lời này, thì "tác dụng phụ" nếu có là gì? (Tôi sẽ không sử dụng sidekick, chỉ là Threadlớp học)
onebree

1
Tôi cũng tò mò không biết các tác dụng phụ là gì (từ việc sử dụng một trong hai phương pháp). Nếu bạn thay đổi thư mục làm việc, bạn luôn có thể thay đổi nó trở lại, phải không?
stevec 17/02/19

Không biết có lúc nào bạn không thể ... chỉ cần làm original_directory = Dir::pwd, sau đó nhớ lại biến sau như vậy:Dir::chdir(original_directory)
Poyda

11

hệ thống hỗ trợ: đối số chdir cho phép bạn chỉ định thư mục làm việc của nó:

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

đầu ra '/ tmp'




1

Tại sao bạn không thể làm 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ó khăn hơn để chẩn đoán điều gì đã xảy ra - ứng dụng rails bị lỗi, cd bị lỗi hay máy chủ rails bị lỗi?
ablarg

1

Các dòng sau có cùng đầu ra:

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

Ngoài ra, bạn có thể chạy rails và tạo một ứng dụng (điều này có thể hữu ích trong các bài kiểm tra rspec, v.v.):

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

và bao giờ bạn có thể chạy một máy chủ rails;)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.