rake任务变量

Mel*_*lon 18 rake ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我在同一名称空间下有两个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
Run Code Online (Sandbox Code Playgroud)

如您所见,两个任务都在同一名称空间下,并且两个任务都使用server_name='myserver' 常量变量.

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

Dav*_*ulc 17

试试这个:

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
Run Code Online (Sandbox Code Playgroud)

命名空间可以访问在其作用域之前声明的变量.


Dav*_* J. 6

我想建立David Sulc的答案,但我建议使用实例变量:

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
Run Code Online (Sandbox Code Playgroud)

这里的优点是以后的代码可以修改@server_name- 你不能用局部变量做的事情:

namespace :db do
  @server_name = 'server_2'
end
Run Code Online (Sandbox Code Playgroud)

  • 实例变量在某个对象的上下文中进行计算(不在像`in_namespace()`这样的方法的上下文中.Brood中的块/`Proc`在声明块时被绑定到一个对象(而不是在`call`ed时/`yield`ed - 除了`instance_eval`和一些你不想知道的`UnboundMethod#bind`魔法..正如我所见,`TaskManager#in_namespace`不使用`instance_eval`因此导致共享所有所有`rake`任务中的实例变量.如果这个混乱适合你,那对你没问题,但这绝对不是**更好的方式**. (4认同)