如何从类中访问“全局”(常量?)capistrano变量? (ruby)

所以我在capistrano中的deploy.rb脚本就像这样开始,我猜这很正常:

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 #::SomeClass (NameError) 

我究竟做错了什么?? 谢谢

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

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

 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 

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