【问题标题】:How to create Thor::Group class variables如何创建 Thor::Group 类变量
【发布时间】:2011-10-06 15:19:00
【问题描述】:

我似乎无法让变量在 Thor::Group 中工作。我已经尝试了所有方法来定义常量 $CONFIG $STAGING_DIR 但它们就是不起作用。

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/test/ -- Repository 似乎是一个本地目录 零 无

有谁知道如何让 Thor::Group 中的类变量可访问?

【问题讨论】:

    标签: ruby thor


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多