2013-02-23 119 views
1

所以在Capistrano的我deploy.rb脚本启动这样的,我的猜测是相当正常:如何从类访问“全局”(常量?)capistrano变量? (红宝石)

require 'capistrano/ext/multistage' 
require 'nokogiri' 
require 'curb' 
require 'json' 

# override capistrano defaults 
set :use_sudo, false 
set :normalize_asset_timestamps, false 

# some constant of mine 
set :my_constant, "foo_bar" 

后来,我可以命名空间内访问我不断在功能或任务,如:

namespace :mycompany do 
    def some_function() 
     run "some_command #{my_constant}" 
    end 

    desc <<-DESC 
     some task description 
    DESC 
    task :some_task do 
     run "some_command #{my_constant}" 
    end 
end 

不过,如果我使用常量一类,像这样:

namespace :mycompany do 
    class SomeClass 
     def self.some_static_method() 
      run "some_command #{my_constant}" 
     end 
    end 
end 

它失败:

/config/deploy.rb:120:in `some_static_method': undefined local variable or method `my_constant' for #<Class:0x000000026234f8>::SomeClass (NameError) 

我在做什么错? 谢谢

回答

1

deploy.rb文件是instance_evaled,这意味着它是在对象的上下文中执行的,因此您声明的任何内容都将可用,直到您离开该上下文为止。只要你创建一个提供新的上下文的类。

为了访问原始上下文,您必须将对象(self)传递给类方法。

namespace :mycompany do 
    class SomeClass 
    def self.some_static_method(cap) 
     run "some_command #{cap.fetch(:my_constant)}" 
    end 
    end 

    SomeClass.some_static_method(self) 
end 

虽然我真的不明白为什么要宣布这样的一类,它是它的一个奇怪的地方。