如何从类中访问“全局”(常量?)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
虽然我真的不明白为什么你要宣布这样的课程,但这是一个奇怪的地方。