2011-10-06 36 views
0

我似乎無法讓變量在Thor :: Group中工作。我已經嘗試了所有的東西來定義常量$配置$ STAGING_DIR,但他們只是不工作。如何創建Thor :: Group類變量

class Package < Thor::Group 
include Thor::Actions 
attr_accessor :staging_dir, :config 
argument :repo, :type => :string, :desc => "The repo to export" 
desc "Testing 1.2.3..." 

def test_meth 
    uri = URI.parse(repo) 
    if uri.kind_of?(URI::Generic) 
     say "-- Repository seems to be a local directory", :cyan 
     if File.exist? repo 
      @config = YAML.load_file(repo + "/project.yaml") 
      @staging_dir = "/var/tmp/pkg/stage/" + @config["project"]["name"] 
      FileUtils.remove_dir @staging_dir if File.exists? @staging_dir 
      empty_directory @staging_dir 
      directory(repo, @staging_dir) 
     end 
    end 
end 

def failure 
    puts @config 
    puts @staging_dir 
end 

def self.source_root 
    File.dirname(@staging_dir) 
end 


end 
Package.start 

./fubar/var/tmp中/測試/ - 庫似乎是一個本地目錄 零 零

有誰知道如何讓雷神類變量訪問::集團?

回答

1

只需定義一些私人方法。私有方法不會像Thor腳本中的常規方法那樣自動執行。方法中的實例變量會在第一次調用方法時評估放在|| =右側的東西。結果然後返回。此後,它只是返回值。因此,您的代碼將被重新編寫如下:

class Package < Thor::Group 
    include Thor::Actions 
    attr_accessor :staging_dir, :config 
    argument :repo, :type => :string, :desc => "The repo to export" 
    desc "Testing 1.2.3..." 

    def test_meth 
     uri = URI.parse(repo) 
     if uri.kind_of?(URI::Generic) 
      say "-- Repository seems to be a local directory", :cyan 
      if File.exist? repo 
       FileUtils.remove_dir staging_dir if File.exists? staging_dir 
       empty_directory staging_dir 
       directory(repo, staging_dir) 
      end 
     end 
    end 

    def failure 
     puts config 
     puts staging_dir 
    end 

    def self.source_root 
     File.dirname(staging_dir) 
    end 

    private 

    def config 
    @config ||= YAML.load_file(repo + "/project.yaml") 
    end 

    def staging_dir 
    @staging_dir ||= "/var/tmp/pkg/stage/" + @config["project"]["name"] 
    end 

end 
Package.start