2015-01-06 20 views
5

Tôi có một tập tin cào thiết lập như sau:Rake nhiệm vụ ngoài không gian tên

require 'rake' 

namespace :setup do 
    puts "I'm in setup" 
    task :create do 
    puts "I'm in create" 
    end 
end 

task :run do 
    puts "I'm in run" 
end 

Nếu tôi chạy rake setup:create tôi nhận được mong đợi:

I'm in setup 
I'm in create 

Tuy nhiên, nếu tôi chạy rake run tôi nhận được:

I'm in setup 
I'm in run 

Từ những gì tôi có thể nói in the guides, điều này là bất ngờ như đã nêu ở đây:

Khi tìm kiếm tên tác vụ, cào sẽ bắt đầu với không gian tên hiện tại và tìm tên ở đó. Nếu không tìm thấy tên trong không gian tên hiện tại, nó sẽ tìm kiếm các không gian tên cha cho đến khi tìm thấy kết quả phù hợp (hoặc xảy ra lỗi nếu không có kết quả trùng khớp).

Sẽ không giả định rake bắt đầu tại không gian tên hiện tại và sau đó di chuyển tìm kiếm thứ gì đó. Trong ví dụ của tôi, tôi không cung cấp một tên hiện tại nhưng nó nhảy vào setup mặc dù tất cả những gì tôi đưa ra là run.

Tôi đang thiếu gì?

Trả lời

4

Dòng puts "I'm in setup" không phải là một phần của bất kỳ tác vụ nào - nó sẽ được thực thi bất kỳ tác vụ nào bạn chỉ định, thậm chí không tồn tại, vì tệp đang được phân tích cú pháp (nói đúng không khi Ruby phân tích tệp đó, nhưng nó đang được thực hiện và thiết lập các nhiệm vụ rake):

$ rake foo 
I'm in setup 
rake aborted! 
Don't know how to build task 'foo' 

(See full trace by running task with --trace) 

Chỉ sau khi tệp đã được đọc, việc tra cứu nhiệm vụ diễn ra, và đó là những gì trích dẫn đề cập đến.

Nếu bạn muốn có một số mã chung cho tất cả các nhiệm vụ của một không gian tên bạn sẽ cần phải tạo ra một nhiệm vụ cho nó và làm cho tất cả các nhiệm vụ khác trong không gian tên phụ thuộc vào nó, ví dụ:

namespace :setup do 
    task :create => :default do 
    puts "I'm in create" 
    end 

    task :default do 
    puts "I'm in setup" 
    end 
end 
+1

Got nó - nhờ matt, có ý nghĩa. – Anthony

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