所以我在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 #<Class:0x000000026234f8>::SomeClass (NameError)
我做错了什么??感谢
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
虽然我真的不明白你为什么要这样声明一个类,但这对它来说是一个奇怪的地方