2011-12-01 7 views
14

Tôi có hai nhiệm vụ Rake dưới cùng namespace như sau:cào biến nhiệm vụ

namespace :db do 
    task :first_task => :environment do 
     server_name='myserver' 
     connect_to(server_name) 
    end 

    task :second_task => :environment do 
      server_name='myserver' 
      do_something_with(server_name) 
    end 
end 

Như bạn thấy, cả hai nhiệm vụ dưới cùng namespace và cả hai nhiệm vụ sử dụng server_name='myserver'biến liên tục. Nó thực sự trông xấu xí để xác định biến server_name hai lần dưới cùng một không gian tên, làm thế nào tôi có thể có một nơi xác định biến này để cả hai nhiệm vụ có thể sử dụng nó?

Trả lời

14

Hãy thử điều này:

namespace :db do 
    server_name='myserver' 
    task :first_task => :environment do 
    connect_to(server_name) 
    end 

    task :second_task => :environment do 
    do_something_with(server_name) 
    end 
end 

Namespaces có quyền truy cập vào các biến khai báo trước khi phạm vi của họ.

6

Tôi muốn xây dựng trên David Sulc's answer, nhưng tôi khuyên bạn nên sử dụng một biến Ví dụ thay vì:

namespace :db do 
    @server_name = 'myserver' 

    task first_task: :environment do 
    connect_to @server_name 
    end 

    task second_task: :environment do 
    do_something_with @server_name 
    end 
end 

Ưu điểm ở đây là mã sau có thể sửa đổi @server_name - một cái gì đó bạn không thể làm gì với một địa phương biến:

namespace :db do 
    @server_name = 'server_2' 
end 
+0

Không, bạn không nên làm điều đó. Lý do là bạn không biết, nơi mà ngà voi đi đến. Không làm gì I. Một nhiệm vụ cào được khai báo bằng cách sử dụng một khối, không phải là một lớp, và do đó bối cảnh của ivar là không rõ ràng. – meandre

+0

@meandre Sự cố khi sử dụng biến mẫu theo cách này là gì? Bạn có thể chứng minh nơi nó có thể đi sai? Bạn có đề xuất nào tốt hơn không? Xem phần "Các biến thể trong các nhiệm vụ" trong http://daneharrigan.com/2010/06/rake-tasks-102/ để thảo luận chi tiết hơn. –

+0

@meandre Trên thực tế, các biến mẫu được định nghĩa theo cách tôi hiển thị được đánh giá trong ngữ cảnh của 'Rake.application.in_namespace (tên, & chặn)' (xem https://github.com/jimweirich/rake/blob/v10.3.2 /lib/rake/dsl_definition.rb#L140). Tôi không chắc bạn quan tâm đến điều gì. –