2011-12-01 117 views
14

我有同样的命名空间下的两个Rake任务类似以下内容:rake任务变量

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 

正如你看到的,任务是同一个命名空间之下,这两个任务使用server_name='myserver'常变量

在相同的命名空间下定义server_name变量真的看起来很丑陋,我怎么能有一个地方定义这个变量,这样两个任务都可以使用它?

回答

14

试试这个:

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 

命名空间访问他们的范围之前声明的变量。

6

我想建立在David Sulc's answer,但我建议使用一个实例变量来代替:

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 

这里的好处是,以后的代码可以修改@server_name - 东西,你不能用本地做变量:

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

不,你不应该那样做。原因是你不知道,伊娃在哪里。我也没有。一个耙子任务是用一个块来声明的,而不是一个类,因此伊娃的背景是不清楚的。 – meandre

+0

@meandre以这种方式使用实例变量有什么问题?你能证明它可能出错的地方吗?你有更好的建议吗?有关更详细的讨论,请参阅http://daneharrigan.com/2010/06/rake-tasks-102/中的“任务中的实例变量”部分。 –

+0

@meandre实际上,以我显示的方式定义的实例变量会在'Rake.application.in_namespace(name,&block)'的上下文中进行评估(请参阅https://github.com/jimweirich/rake/blob/v10.3.2 /lib/rake/dsl_definition.rb#L140)。我不确定你的担心是什么。 –