2010-02-26 31 views
14

Giả sử tôi có mục tiêu cần biên dịch một số tệp. Mục tiêu đó có mục tiêu khác là điều kiện tiên quyết, mục tiêu có được các tệp. Hãy nói điều này:Làm thế nào để bạn giao tiếp giữa các nhiệm vụ Rake?

task :obtain do 
    # obtain files from somewhere 
end 

task :compile => :obtain do 
    # do compilation 
end 

Hãy nói rằng mục tiêu :obtain không phải lúc nào đặt các tập tin trong cùng một thư mục. Làm cách nào để vượt qua :compile đường dẫn mà bạn đã tìm thấy :obtain? Biến môi trường?

Trả lời

13

Sử dụng ENV [ 'cái gì đó'] là theo ý kiến ​​của tôi thích hợp hơn, bởi vì nếu bạn làm theo cách này (trái ngược với $ global hoặc @instance variables), bạn có thể coi những đối số đó là đối số công việc và sử dụng nhiệm vụ phụ từ dòng lệnh dễ dàng.

Mặt khác, nếu bạn giữ mã của mình trong các lớp/mô-đun/phương pháp riêng biệt, bạn thậm chí sẽ không phải đối phó với các loại hacks đó + mã của bạn sẽ dễ kiểm tra hơn.

+0

Vâng. Đây là cách tôi đã làm nó. Cảm ơn! – Geo

+0

Cần lưu ý rằng ENV chỉ có thể lấy chuỗi là khóa và giá trị, do đó, trong khi hạn chế này có thể không quan trọng trong trường hợp tên tệp, thì đó có thể không phải là giải pháp tốt khi xử lý các loại giá trị khác. – Dologan

10

Một cách sẽ được để lưu trữ nó trong một biến toàn cầu:

task :obtain do 
    $obtained_dir = "/tmp/obtained" 
end 

task :compile => :obtain do 
    puts "compiling files in #{$obtained_dir}" 
end 

biến Instance (ví dụ: @obtained_dir) cũng nên làm việc.

Một cách khác là để kéo các mã "được" vào một phương pháp như sau:

task :obtain do 
    obtain_files 
end 

task :compile do 
    obtained_dir = obtain_files 
    puts "compiling files in #{obtained_dir}" 
end 

def obtain_files 
    #obtain files from somewhere 
    "/tmp/obtained_files" 
end 
+1

+1 để có cách thực hiện phương pháp này. nhiệm vụ: có được không có vẻ như đó là một nhiệm vụ ở tất cả, nó chỉ là một phương pháp mà người khác gọi. –

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