1

したがって、カピストラーノの 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)

私は何を間違っていますか?? ありがとう

4

1 に答える 1

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

なぜこのようなクラスを宣言しているのか本当にわかりませんが、それは奇妙な場所です。

于 2013-02-24T09:57:10.190 に答える